检测异步JMS MessageConsumer何时出现异常?

5
我正在使用JMS MessageConsumerMessageListener 处理消息。如果发生什么导致 MessageConsumer 停止接收和处理消息的情况,例如底层连接关闭,我该如何检测?在 规范文档 中似乎没有任何通知机制。
如果需要更清晰的问题描述,请告诉我,我可以提供相关代码。
如果有必要,我正在使用ActiveMQ 5.8,但我希望方案不依赖于具体实现。
1个回答

2

使用ExceptionListener

如果JMS系统检测到问题,它会调用监听器的onException方法:

public class MyConsumer implements ExceptionListener, MessageListener {

    private void init(){
        Connection connection = ... //create connection
        connection.setExceptionListener(this);
        connection.start();
    }

    public void onException(JMSException e){
        String errorCode = e.getErrorCode();
        Exception ex = e.getLinkedException();
        //clean up resources, or, attempt to reconnect 
    }

    public void onMessage(Message m){
       ...
}

其实并没有太多复杂的东西,以上内容是独立使用者的标准做法;它不是特定于实现的;相反,它是规范的一部分!因此,所有符合JMS标准的供应商都将支持它。


1
我怎么知道JMS代理是否存活?如何判断JMS连接是否仍然正常?这能告诉我们JMS代理是否在线吗?谢谢。 - tonga
你在Connection对象上设置了ExceptionListener,对吧?鉴于ExceptionListener是基于Connection的范围,我会得到哪些JMSException呢?我怀疑我会得到与我的MessageConsumer相关的任何异常,以及其他许多异常。如何判断任何给定的异常是否与我的MessageConsumer相关,而不是Connection上的其他内容? - sigpwned
异常告诉你连接实例无效,应该被丢弃;尝试使用循环打开一个新的连接实例,并在之间设置时间延迟,以便给服务器恢复的时间。如果成功,那么你就知道了。 - raffian
谢谢您的快速回复!因此,任何对onException()的调用都表示底层的Connection已断开,我应该将其拆除并重建。我理解得对吗? - sigpwned
1
没错,不要试图理解错误;我更新了我的回答,抱歉打错字了,这个小iPhone屏幕真让人头疼! - raffian
此外,我们还遇到了一些奇怪的连接失败情况,其中服务器知道它无法看到客户端,但客户端仍然认为它的连接是有效的(onException从未被调用,如果您查看JMS连接/会话/订阅者,则可以看到它们仍然认为自己已连接)。在使用默认http远程设置的JBoss5中,这非常容易复制。 - Shadow Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接