java - JMS 监听器发生异常时会发生什么

标签 java spring-boot transactions spring-jms

我正在使用默认消息监听器容器。我已在配置中将 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;只需抛出异常而不是捕获异常,容器就会回滚交付。

具体来说,如果异常是 JmsExceptionRuntimeException(或子类)或 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/

相关文章:

c# 如何延长mongodb事务生命周期

java - 迭代字符串列表以获得最短的单词?

java - JPA EntityManager创建 native 查询不返回外键数据

javascript - 如何在不转换为 Angular 中的字符串的情况下在多部分/表单数据请求中发送对象

java - Hibernate session 跟踪对象

PostgreSQL : Transaction and foreign key problem

java - 寻找最大的数

java - JFreechart 编译时错误的演示示例?

java - 双向链表查找法

json - Spring Controller 修剪 JSON 数据的建议