繁体   English   中英

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

[英]What happens when an exception occurs in JMS listener

我正在使用默认消息侦听器容器。 我在配置中将会话事务处理属性设置为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块处理所有可能的异常。 我对吗?

您不需要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);
    }
}

你试过SessionAwareMessageListener吗? 点击这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM