我们有一个 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 个月了,没有出现任何问题。除了许多其他功能之外,它还具有完全透明的故障转移功能。

另外,如果你确实选择了 Spring,那么 非常 小心Jms模板.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top