[英]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
; 只需抛出异常而不是捕获它,容器将回滚传递。
具体来说,如果异常是JmsException
, RuntimeException
(或子类)或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.