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

sig*_*ned 5 java activemq-classic jms mom

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

我认为这个问题很清楚,但如果你想让我发布代码来澄清这个问题,那就问吧!

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

raf*_*ian 2

使用异常监听器

如果 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){
       ...
}
Run Code Online (Sandbox Code Playgroud)

没什么太多的,实际上,以上是独立消费者的标准做法;它不是特定于实现的;实际上,恰恰相反,因为它是规范的一部分!因此所有符合 JMS 的提供程序都将支持它。