【问题标题】:How to do manual commit using spring's DefaultMessageListenerContainer?如何使用spring的DefaultMessageListenerContainer进行手动提交?
【发布时间】:2011-07-31 23:15:35
【问题描述】:

我们有一个应用程序在消息队列上侦听,我知道 dmlc 提供了一个 sessionTransacted 属性,我假设它允许我们手动提交消息接收事件,但是我不确定如何在侦听器中利用它.

似乎只要抛出一个 RuntimeException 消息就会被放回队列中,如果没有设置 ErrorHandler 则进入循环,但我们想专门提交接收。

例如

public class JMSMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message) {
       // do something with the message and then manually commit
    }
}

【问题讨论】:

    标签: java spring commit mq


    【解决方案1】:

    A 有使用 ActiveMQ 的经验。当sessionTransacted开启时,如果你的应用程序在onMessage中意外关闭,重启后会再次处理该消息。如果会话没有被交易,它将会丢失。

    您不能使用sessionTransacted 手动控制事务(除了抛出异常以回滚消息)。你可能想看看SessionAwareMessageListener,虽然我从未尝试过。

    【讨论】:

    • 像魅力一样工作,正是我想要的:)
    • 很抱歉提出一个旧线程,但您能详细说明您选择的解决方案吗?我也遇到了类似的问题。我理解抛出异常会导致回滚,但如果我可以通过获取会话自己管理事务,那就更好了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2017-09-10
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多