重新将JMS侦听器连接到JBossMQ
我们有一个Java侦听器,它从JBossMQ的队列中读取文本消息。如果必须重新启动JBoss,则侦听器将不会重新连接并重新开始阅读消息。我们只是每2分钟在侦听器的日志文件中收到一条消息,指出该消息无法连接。我们在代码或者JBossMQ中没有设置什么吗?我是JMS的新手,因此将非常感谢帮助。谢谢。
解决方案
回答
我们应该在客户端代码中实现javax.jms.ExceptionListener。我们将需要一个名为onException的方法。当客户端的连接断开时,我们应该得到一个JMSException,并且此方法将被自动调用。我们唯一需要注意的是,如果我们有意断开与JBossMQ的连接,这也会引发异常。
一些代码可能看起来像这样:
public void onException (JMSException jsme) { if (!closeRequested) { this.disconnect(); this.establishConnection(connectionProps, queueName, uname, pword, clientID, messageSelector); } else { //Client requested close so do not try to reconnect } }
在" EstablishmentConnection"代码中,我们将实现一个" while(!initialized)"结构,其中包含一个try / catch。在确定已正确连接并订阅之前,请留在while循环中,以捕获所有JMS / Naming / etc。例外情况。
我们在JBossMQ中使用这种方法已有多年,并且效果很好。弹跳JBossMQ或者失去我们的网络连接后,我们的JMS客户端不重新连接就没有问题。
回答
我强烈建议我们使用JMS的Spring抽象,例如MessageListenerContainer来为我们处理重新连接,事务和池。我们只需要提供一个MessageListener并使用ConnectionFactory配置MessageListenerContainer,其余的工作就由容器完成。
回答
如果我们纯粹是侦听器,并且除连接设置外不执行其他JMS调用,那么" onException()处理程序"答案是正确的。
如果我们在代码中执行任何JMS调用,仅使用onException()回调是不够的。通过JMS方法调用上的异常或者通过onException()回调将问题从JMS提供程序中继到应用程序。不是都。
因此,如果我们从代码中调用任何JMS方法,并且我们在这些调用中遇到任何异常,也将希望调用该重新连接逻辑。
回答
来自个人经验的建议。升级到JBoss Messaging。我已经在生产中看到它四个月没有问题了。除其他功能外,它还具有完全透明的故障转移功能。
此外,如果我们确实选择使用Spring,请非常注意JmsTemplate。