我正在使用默认消息侦听器容器。我在配置中将会话事务处理属性设置为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
块处理所有可能的异常。我是对的吗?
答案 0 :(得分:2)
你不需要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);
}
}
答案 1 :(得分:0)
您是否尝试过SessionAwareMessageListener?请检查here