【问题标题】: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();