【问题标题】:What happens when an exception occurs in JMS listener当 JMS 监听器发生异常时会发生什么
【发布时间】:2017-09-29 02:49:18
【问题描述】:

我正在使用默认消息侦听器容器。我已在配置中将会话事务属性设置为 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 块处理所有可能的异常。我说的对吗?

【问题讨论】:

    标签: java spring-boot transactions spring-jms


    【解决方案1】:

    您不需要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);
        }
    }
    

    【讨论】:

    • 由于我使用 Throwable 进行捕获,它不会捕获所有可能的异常,因为 throwable 是所有异常和错误的父类。
    • 是的,但“吃”Throwable 不是一个好主意 - 它可能是一个 Error,例如 OOM。在任何情况下,要强制回滚,您必须将 Throwable 包装在 RuntimeException 中,因为您无法重新抛出它,因为方法签名不允许这样做。
    • 可以通过代码演示一下吗?我不知道如何在代码中实现你所说的。
    • 我在 JMS 异常块中有一些逻辑,需要在回滚之前执行。那你的建议还有效吗?
    • 查看编辑;在抛出异常之前不会发生回滚。
    【解决方案2】:

    你试过 SessionAwareMessageListener 吗?请查看here

    【讨论】:

    • 它有什么作用?所以目前我的类实现了消息监听器,现在它必须实现 sessionwaremessagelistener,对吧?
    • 另外,我必须通过会话对象手动确认,并在必要时通过会话对象在 catch 块中调用回滚。我相信这就是你所说的我应该实施它的方式。
    • 由于您在此界面中获得了会话对象,因此您可以根据需要回滚或提交事务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多