我们有一个Java监听器,它从JBossMQ中的队列中读取文本消息。如果我们必须重新启动JBoss,监听器将不会重新连接并再次开始阅读消息。我们每隔2分钟就会在侦听器的日志文件中收到消息,说它无法连接。我们的代码或JBossMQ中是否有设置?我是JMS的新手,所以任何帮助都将不胜感激。感谢。
答案 0 :(得分:10)
您应该在客户端代码中实现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或丢失网络连接后没有重新连接,从未遇到过问题。
答案 1 :(得分:8)
我强烈建议您使用Spring abstractions for JMS such as the MessageListenerContainer来处理重新连接,交易和池化。您只需要提供一个MessageListener并使用ConnectionFactory配置MessageListenerContainer,然后容器完成其余工作。
答案 2 :(得分:6)
如果你纯粹是一个监听器并且除了连接设置之外没有没有其他JMS调用,那么“onException()处理程序”的答案是正确的。
如果在代码中执行任何JMS调用,仅使用onException()回调是不够的。通过onException()回调在JMS方法调用或上通过异常将问题从JMS提供程序中继到app 。不是两个。
因此,如果您从代码中调用任何JMS方法,那么如果您对这些调用有任何异常,您还需要调用该重新连接逻辑。
答案 3 :(得分:1)
来自个人经验的一些建议。 升级到JBoss Messaging。我已经在生产中看到它4个月没有问题。它具有完全透明的故障转移功能 - 还有许多其他功能。
此外,如果你选择Spring,请使用very careful JmsTemplate。