Java 当JMS侦听器中发生异常时会发生什么
我正在使用默认的消息侦听器容器。我已在配置中将会话事务属性设置为true 我的Java 当JMS侦听器中发生异常时会发生什么,java,spring-boot,transactions,spring-jms,Java,Spring Boot,Transactions,Spring Jms,我正在使用默认的消息侦听器容器。我已在配置中将会话事务属性设置为true 我的onMessage()方法如下: public void onMessage(Message message) { try { // Some code here } catch (JmsException jmse) { log.error(jmse); } catch (Throwable t) { log.error(t); } }
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吗?请检查您不需要SessionAwareMessageListener
;只需抛出异常而不是捕获异常,容器就会回滚传递
具体来说,如果异常是jmscexception
、RuntimeException
(或子类)或错误,它将回滚
无论如何,您通常不应该捕获可丢弃的;这不是个好习惯
编辑
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);
}
}
它有什么作用?所以目前我的类实现了消息侦听器,现在它必须实现SessionWareMessageListener,对吗?我还必须通过session对象手动确认,并在必要时通过session对象调用catch块中的回滚。我相信这就是你说我应该实现它的方式。因为你在这个接口中得到了一个会话对象,你可以根据你的要求回滚或提交事务。因为我使用Throwable来捕获,它不是捕获所有可能的异常吗,因为Throwable是所有异常和错误的父类。是的,但是“吃”可丢弃的东西不是个好主意-这可能是一个错误,比如OOM。在任何情况下,要强制回滚,您必须将Throwable
包装在运行时异常
中,因为方法签名不允许重新抛出它。您能通过代码演示吗?我不知道如何在代码中实现您所说的内容。我在JMS异常块中有一些逻辑,需要在回滚之前执行。你的建议仍然有效吗?请参阅编辑;在抛出异常之前,不会发生回滚。