我们有一个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 } }
在"establishConnection"代码中,您将实现一个while(!initialized)
包含try/catch 的构造.在您确定已正确连接和订阅之前,请留在while循环中捕获所有JMS/Naming/etc. 例外.
我们用JBossMQ多年来一直使用这种方法,效果很好.我们的JMS客户端在弹回JBossMQ或丢失网络连接后没有重新连接,我们从未遇到过问题.
我强烈建议您使用JMS的Spring抽象(如MessageListenerContainer)来处理重新连接,事务和池化.您只需要提供MessageListener并使用ConnectionFactory配置MessageListenerContainer,然后容器完成剩下的工作.
如果你纯粹是一个监听器并且除了连接设置之外没有其他JMS调用,那么"onException()处理程序"的答案是正确的.
如果在代码中执行任何JMS调用,则仅使用onException()回调是不够的.问题是从JMS提供到应用程序中继要么经由上的JMS方法调用的异常或通过onException的()回调.不是都.
因此,如果从代码中调用任何JMS方法,如果在这些调用上获得任何异常,您还需要调用该重新连接逻辑.