将 JMS 侦听器重新连接到 JBossMQ
题
我们有一个 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
}
}
在您的“建立连接”代码中,您将实现一个 while(!initialized)
内部包含 try/catch 的构造。在您确定已正确连接并订阅之前,请留在 while 循环中捕获所有 JMS/命名等。例外情况。
我们在 JBossMQ 中使用这种方法已经很多年了,而且效果非常好。我们从未遇到过 JMS 客户端在弹起 JBossMQ 或丢失网络连接后无法重新连接的问题。
其他提示
我强烈建议您使用 JMS 的 Spring 抽象,例如 MessageListenerContainer 为您处理重连、交易和池化事宜。您只需要提供一个 MessageListener 并使用 ConnectionFactory 配置 MessageListenerContainer,容器就会完成其余的工作。
如果你纯粹是一个倾听者并且这样做 不 除连接设置之外的其他 JMS 调用,则“onException() 处理程序”答案是正确的。
如果您在代码中执行任何 JMS 调用,仅使用 onException() 回调是不够的。问题从 JMS 提供者转发到应用程序 任何一个 通过 JMS 方法调用的异常 或者 通过 onException() 回调。不是都。
因此,如果您从代码中调用任何 JMS 方法,并且在这些调用中出现任何异常,您还需要调用重新连接逻辑。
个人经验的建议。 升级到 JBoss 消息传递. 我已经在生产中看到它 4 个月了,没有出现任何问题。除了许多其他功能之外,它还具有完全透明的故障转移功能。