【问题标题】:Detecting when an asynchronous JMS MessageConsumer has an Exception?检测异步 JMS MessageConsumer 何时出现异常?
【发布时间】:2014-01-12 16:11:04
【问题描述】:

我正在使用带有MessageListener 的JMS MessageConsumer 处理消息。如果发生某些事情导致MessageConsumer 停止接收和处理消息——例如,如果底层连接关闭——我该如何检测它?我在the spec 中似乎找不到任何通知机制。

我认为问题很清楚,但如果您希望我发布代码以澄清问题,请提出!

如果这很重要,我使用的是 ActiveMQ 5.8,尽管显然我想要一个不是特定于实现的方案。

【问题讨论】:

    标签: java jms activemq mom


    【解决方案1】:

    使用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 的提供者都会支持它。

    【讨论】:

    • 我知道 JMS 代理是否存在吗?如何判断 JMS 连接是否仍然正常?这可以判断 JMS 代理是否在线吗?谢谢。
    • 您在Connection 对象上设置了ExceptionListener,对吗?鉴于ExceptionListenerConnection-scoped,我希望得到什么JMSExceptions?我怀疑我会遇到与我的MessageConsumer 相关的任何例外情况,此外还有更多例外情况。我如何判断任何给定的异常是否与我的 MessageConsumer 相关,而不是与 Connection 上的其他内容相关?
    • 异常告诉你连接实例不好,应该丢弃;尝试使用循环打开一个新的,中间有时间延迟,让服务器有时间恢复,如果成功,这就是你知道的
    • 感谢您的快速回复!所以对onException() 的任何调用都表明底层Connection 已损坏,我应该拆除并重建。我说得对吗?
    • 没错,不要试图理解错误;更新了我的答案,抱歉错别字,该死的 iPhone 小屏幕!
    猜你喜欢
    • 2013-01-13
    • 1970-01-01
    • 2021-12-30
    • 2015-11-20
    • 2021-11-02
    • 2016-06-26
    • 2016-02-21
    • 2015-06-28
    • 1970-01-01
    相关资源
    最近更新 更多