将JMS监听器重新连接到JBossMQ

问题描述:

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

+0

好问题。这是每个人都遇到的问题,所以最好记录下讨论。 – 2009-11-17 16:27:14

您应该在客户端代码中实现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 /命名/等等。例外。

我们在JBossMQ中使用了这种方法多年,它效果很好。在弹出JBossMQ或丢失我们的网络连接之后,我们的JMS客户端从未遇到过无法重新连接的问题。

+0

请注意,应该使用Connection#setExceptionListener(至少包含一些JMS提供程序)来注册ExceptionListener。 – Touko 2008-11-25 13:55:47

我强烈建议您使用Spring abstractions for JMS such as the MessageListenerContainer来为您处理重新连接,交易和合并。你只需要提供一个MessageListener,然后用ConnectionFactory配置MessageListenerContainer,剩下的就是容器。

如果你纯粹是一个听众,并且其他JMS调用不是连接设置,那么“onException()处理程序”的答案是正确的。

如果您在代码中执行任何JMS调用,只需使用onException()回调是不够的。通过onException()回调,JMS提供程序通过JMS方法调用发生异常,将问题从JMS提供程序传递到应用程序或者。不是都。

因此,如果您从您的代码中调用任何JMS方法,那么如果您在这些调用中发现任何异常,您还需要调用该重新连接逻辑。

个人经验建议。 升级至JBoss Messaging我已经在生产中见过4个月没有问题。它具有完全透明的故障转移 - 其他许多功能。

此外,如果你确实去了春季,verycarefulJmsTemplate