重新将JMS侦听器连接到JBossMQ

时间:2020-03-05 18:48:45  来源:igfitidea点击:

我们有一个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
        }
    }

在" EstablishmentConnection"代码中,我们将实现一个" while(!initialized)"结构,其中包含一个try / catch。在确定已正确连接并订阅之前,请留在while循环中,以捕获所有JMS / Naming / etc。例外情况。

我们在JBossMQ中使用这种方法已有多年,并且效果很好。弹跳JBossMQ或者失去我们的网络连接后,我们的JMS客户端不重新连接就没有问题。

回答

我强烈建议我们使用JMS的Spring抽象,例如MessageListenerContainer来为我们处理重新连接,事务和池。我们只需要提供一个MessageListener并使用ConnectionFactory配置MessageListenerContainer,其余的工作就由容器完成。

回答

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

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

因此,如果我们从代码中调用任何JMS方法,并且我们在这些调用中遇到任何异常,也将希望调用该重新连接逻辑。

回答

来自个人经验的建议。升级到JBoss Messaging。我已经在生产中看到它四个月没有问题了。除其他功能外,它还具有完全透明的故障转移功能。

此外,如果我们确实选择使用Spring,请非常注意JmsTemplate。