在JMS侦听器中发生异常时会发生什么

时间:2017-09-29 02:49:19

标签: java spring-boot transactions spring-jms

我正在使用默认消息侦听器容器。我在配置中将会话事务处理属性设置为true。

我的onMessage()方法是:

public void onMessage(Message message) {
    try {
        // Some code here
    } catch (JmsException jmse) {
        log.error(jmse);
    } catch (Throwable t) {
        log.error(t);
    }
}

正如您所看到的,我正在catch块中处理异常。

我的要求是,如果它是JMS异常,则应该重新发送它,即当事务回滚时,消息重新传递给侦听器/消费者。怎么会发生这种情况?

我们可以在这里手动回滚交易吗?我认为这是一个可能的解决方案,但我不知道如何在代码中这样做。

另一个通用问题:

由于我通过catch块处理所有可能的异常,我想不会有消息重新传递的情况,即事务回滚,因为我通过catch块处理所有可能的异常。我是对的吗?

2 个答案:

答案 0 :(得分:2)

你不需要SessionAwareMessageListener;只需抛出异常而不是捕获它,容器将回滚传递。

具体而言,如果异常是JmsExceptionRuntimeException(或子类)或Error,它将回滚。

你通常不应该抓住Throwable;这不是一个好习惯。

修改

public void onMessage(Message message) {
    try {
        // Some code here
    } 
    catch (JmsException jmse) {
        log.error(jmse);
        // Do some stuff
        throw new RuntimeException(jmse); // JMSException is checked so can't throw
    }
    catch (RuntimeException e) {
        log.error(e);
        throw e;
    }
    catch (Exception e) {
        log.error(t);
        throw new RuntimeException(e);
    }
}

答案 1 :(得分:0)

您是否尝试过SessionAwareMessageListener?请检查here