【问题标题】:ActiveMQ: acking one message at a timeActiveMQ:一次确认一条消息
【发布时间】:2013-05-30 12:25:55
【问题描述】:

我正在为 C++ 使用 ActiveMQ。 在我们计划的设计中,我们将使用消息,将它们传递给一些异步处理,然后才将消息视为已处理。 我们希望并行处理多个消息——每个消息将在不同的时间完成处理——并且只确认那些完成处理的消息。这是为了避免在服务器宕机、进程崩溃等情况下丢失消息。

从文档和测试中,我了解到在 CLIENT_ACKNOWLEDGE 和 SESSION_TRANSACTED 模式下,无法只确认一条消息。 这种情况有最佳实践吗?我应该持有一个“会话池”,每个会话一次同步处理一条消息然后确认它吗?

谢谢。

【问题讨论】:

    标签: activemq activemq-cpp


    【解决方案1】:

    虽然我从未真正在 C++ 中为 ActiveMQ 实现并发使用者,但这是您通常在 Java 中处理此类情况的方式。

    使用会话和消息侦听器创建多个不同的线程,每个线程读取队列的消息,进行处理,然后提交事务(如果您不想要事务,则确认)。

    【讨论】:

      【解决方案2】:

      当您创建会话时,您可以使用 cms::Session 确认模式 INDIVIDUAL_ACKNOWLEDGE,它允许您确认单个消息。 cms::Message 对象有一个确认方法,您可以使用它来确认每条消息。

      cms::Session* session = connection.createSession(cms::Session::INDIVIDUAL_ACKNOWLEDGE);
      

      确认消息:

      cms::Message* message = consumer.receive();
      message->acknowledge();
      

      【讨论】:

        猜你喜欢
        • 2012-05-10
        • 2012-10-25
        • 2014-05-06
        • 2014-11-17
        • 1970-01-01
        • 2020-06-17
        • 2019-03-02
        • 1970-01-01
        • 2015-12-02
        相关资源
        最近更新 更多