我们有一个从JBossMQ队列中读取文本消息的。如果我们必须重新启动JBoss,监听程序将不会重新连接并再次开始读取消息。我们每隔2分钟就会在监听器的日志文件中收到一条消息,告诉我们它无法连接。有没有什么东西我们没有在我们的代码或JBossMQ中设置?我是JMS的新手,因此任何帮助都将不胜感激。谢谢。
发布于 2008-09-07 00:05: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“代码中,您将实现一个内部包含try/catch的while(!initialized)构造。在您确定已正确连接和订阅之前,请留在while循环中,捕获所有JMS/命名/等异常。
我们在JBossMQ中使用这种方法已经有几年了,效果很好。我们从来没有遇到过我们的JMS客户端在弹出JBossMQ或失去网络连接后无法重新连接的问题。
发布于 2008-09-16 14:24:52
我强烈建议您使用Spring abstractions for JMS such as the MessageListenerContainer为您处理重新连接、事务和池化。您只需提供一个MessageListener并使用ConnectionFactory配置MessageListenerContainer,剩下的工作由容器完成。
发布于 2008-09-22 20:43:01
如果您纯粹是一个侦听器,并且只执行连接设置之外的其他JMS调用,那么"onException()处理程序“的答案是正确的。
如果在代码中执行任何JMS调用,仅使用onException()回调是不够的。通过JMS方法调用的异常或通过onException()回调,将问题从JMS提供程序中继到应用程序。不是两个都有。
因此,如果您从代码中调用任何JMS方法,如果在这些调用中得到任何异常,您还需要调用重新连接逻辑。
https://stackoverflow.com/questions/47683
复制相似问题