gpt4 book ai didi

java - JMS 监听器发生异常时会发生什么

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:10:19 25 4
gpt4 key购买 nike

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

我的 onMessage() 方法是这样的:

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

如您所见,我正在 catch block 中处理异常。

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

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

另一个通用问题:

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

最佳答案

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

关于java - JMS 监听器发生异常时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46481071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com