我正在使用默认消息监听器容器。我已在配置中将 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
;只需抛出异常而不是捕获异常,容器就会回滚交付。
具体来说,如果异常是 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);
}
}
关于java - JMS 监听器发生异常时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46481071/