将JMS侦听器重新连接到JBossMQ

我们有一个Java监听器,它从JBossMQ中的队列中读取文本消息。 如果我们必须重新启动JBoss,监听器将不会重新连接并再次开始读取消息。 我们每隔2分钟就会在侦听器的日志文件中收到消息,说它无法连接。 我们的代码或JBossMQ中是否有设置? 我是JMS的新手,所以任何帮助都将不胜感激。 谢谢。

您应该在客户端代码中实现javax.jms.ExceptionListener。 您将需要一个名为onException的方法。 当客户端的连接丢失时,您应该获得JMSException,并且将自动调用此方法。 您唯一需要注意的是,如果您故意断开与JBossMQ的连接 – 这也会引发exception。

有些代码可能如下所示:

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 } } 

在“establishConnection”代码中,您将实现一个while(!initialized)构造,其中包含try / catch。 在您确定已正确连接和订阅之前,请留在while循环中捕获所有JMS / Naming / etc. 例外。

我们用JBossMQ多年来一直使用这种方法,效果很好。 我们的JMS客户端在弹回JBossMQ或丢失网络连接后没有重新连接,我们从未遇到过问题。

我强烈建议您使用JMS的Spring抽象(如MessageListenerContainer)来处理重新连接,事务和池化。 您只需要提供MessageListener并使用ConnectionFactory配置MessageListenerContainer,然后容器完成剩下的工作。

如果你纯粹是一个监听器并且除了连接设置之外没有其他JMS调用,那么“onException()处理程序”的答案是正确的。

如果在代码中执行任何JMS调用,则仅使用onException()回调是不够的。 通过JMS方法调用的exception通过onException()回调,问题从JMS提供程序中继到应用程序。 不是都。

因此,如果从代码中调用任何JMS方法,如果在这些调用上遇到任何exception,您还需要调用该重新连接逻辑。

来自个人经验的建议。 升级到JBoss Messaging 。 我已经在生产中看到它4个月没有问题。 它具有完全透明的故障转移function – 还有许多其他function。

另外,如果你选择Spring,请小心使用JmsTemplate 。