Java 当JMS侦听器中发生异常时会发生什么

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); } }

我正在使用默认的消息侦听器容器。我已在配置中将会话事务属性设置为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吗?请检查您不需要
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异常块中有一些逻辑,需要在回滚之前执行。你的建议仍然有效吗?请参阅编辑;在抛出异常之前,不会发生回滚。