【问题标题】:Reconnecting JMS listener to JBossMQ将 JMS 侦听器重新连接到 JBossMQ
【发布时间】:2008-09-06 17:33:00
【问题描述】:

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

【问题讨论】:

  • 好问题。这是每个人都会遇到的事情,所以最好把讨论记录下来。

标签: java jboss jms jbossmq


【解决方案1】:

您应该在您的客户端代码中实现 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/Naming/等。例外。

我们多年来一直在 JBossMQ 中使用这种方法,并且效果很好。我们从来没有遇到过 JMS 客户端在弹回 JBossMQ 或失去网络连接后没有重新连接的问题。

【讨论】:

  • 请注意,应该使用 Connection#setExceptionListener(至少使用一些 JMS 提供程序)来注册 ExceptionListener。
【解决方案2】:

我强烈建议您使用Spring abstractions for JMS such as the MessageListenerContainer 为您处理重新连接、事务和池。您只需要提供一个 MessageListener 并使用 ConnectionFactory 配置 MessageListenerContainer ,其余的由容器完成。

【讨论】:

    【解决方案3】:

    如果您是纯粹的侦听器,并且除了连接设置之外执行其他 JMS 调用,那么“onException() 处理程序”的答案是正确的。

    如果您在代码中执行任何 JMS 调用,仅使用 onException() 回调是不够的。问题通过 JMS 方法调用上的异常通过 onException() 回调从 JMS 提供程序中继到应用程序。两者都不是。

    因此,如果您从代码中调用任何 JMS 方法,如果您在这些调用中遇到任何异常,您还需要调用该重新连接逻辑。

    【讨论】:

      【解决方案4】:

      个人经验的建议。 升级到JBoss Messaging我已经看到它在生产中使用了 4 个月没有问题。它具有完全透明的故障转移 - 以及许多其他功能。

      另外,如果您选择 Spring,请使用 very carefulJmsTemplate

      【讨论】:

        猜你喜欢
        • 2015-02-03
        • 2018-12-19
        • 1970-01-01
        • 2015-06-07
        • 1970-01-01
        • 2014-02-20
        • 2011-10-09
        • 1970-01-01
        • 2018-04-05
        相关资源
        最近更新 更多