将JMS侦听器重新连接到JBossMQ

时间:2008-09-06 17:33:00

标签: java jboss jms jbossmq

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

4 个答案:

答案 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