代码之家  ›  专栏  ›  技术社区  ›  MattGrommes

将JMS侦听器重新连接到jbossMQ

  •  13
  • MattGrommes  · 技术社区  · 17 年前

    我们有一个Java侦听器,它从JBossMQ的队列中读取文本消息。如果必须重新启动jboss,侦听器将不会重新连接并重新开始读取消息。我们只是每隔2分钟在侦听器的日志文件中收到一条消息,说它无法连接。我们的代码或jbossmq中是否有未设置的内容?我是新来的JMS,所以任何帮助都将非常感谢。谢谢。

    4 回复  |  直到 15 年前
        1
  •  10
  •   Jason Plank Maksim Kondratyuk    15 年前

    您应该在客户机代码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/etc.异常。

    我们在jbossmq中使用这种方法已经很多年了,而且效果很好。我们从未遇到过JMS客户机在跳跃jbossmq或失去网络连接后未重新连接的问题。

        2
  •  8
  •   James Strachan    17 年前

    我强烈建议你使用 Spring abstractions for JMS such as the MessageListenerContainer 为您处理重新连接、事务和池。您只需要提供一个messageListener,并用connectionFactory配置messageListenerContainer,容器就可以完成其余的工作。

        3
  •  6
  •   John M    17 年前

    如果你只是一个倾听者 除连接设置以外的其他JMS调用,则“onException()处理程序”的答案是正确的。

    如果在代码中执行任何JMS调用,仅仅使用onException()回调是不够的。问题从JMS提供程序中继到应用程序 任何一个 通过对JMS方法调用的异常 通过onException()回调。并非两者兼而有之。

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

        4
  •  1
  •   user13229    17 年前

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

    另外,如果你真的要和春天一起去,就要 very careful JmsTemplate .