将 JMS 侦听器重新连接到 JBossMQ
我们有一个Java侦听器,它从JBossMQ中的队列中读取文本消息。如果我们必须重新启动 JBoss,侦听器将不会重新连接并再次开始读取消息。我们只是每2分钟在侦听器的日志文件中收到一条消息,说它无法连接。有没有我们没有在代码或JBossMQ中设置的东西?我是JMS的新手,所以任何帮助将不胜感激。谢谢。
我们有一个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
}
}
在“建立连接”代码中,您将实现一个内部包含 try/catch 的构造。在确定已正确连接和订阅之前,请留在 while 循环中,以捕获所有 JMS/命名/等异常。while(!initialized)
我们已经在 JBossMQ 中使用此方法多年,效果很好。我们的 JMS 客户端在跳出 JBossMQ 或失去网络连接后无法重新连接,这从未遇到过问题。
我强烈建议您使用JMS的Spring抽象,例如MessageListenerContainer来处理重新连接,事务和池化。你只需要提供一个 MessageListener,并使用 ConnectionFactory 配置 MessageListenerContainer,容器就可以完成剩下的工作。