1

简化:
我在activemq中有一个队列。当从队列中读取某条消息时,我想锁定队列,直到该进程结束处理接收到的消息。

详细解释:
我有一个拥有大量用户的系统。每次用户更改他在系统中的状态(配置文件、角色、访问权限、资产所有权等)时,我还需要使用这些更改更新第三方服务器。该第三方与我们是分开的,他们向我公开的 api 允许我一次只更新一个用户,大约需要一秒钟。
我正在使用 ActiveMQ 将主更新过程与更新第三方系统分离。

每晚一次,我会收到一个可能包含数千个用户更改的提要文件。由于这是一项关键任务,并且更新第三方对时间不那么敏感,并且由于更新第三方可能需要从同一个表中读取,所以主进程是批量更新,我需要锁定队列。意思是,我希望 ActiveMQ 为我在主进程中更改的每个用户获取消息,但我也希望 ActiveMQ 保留这些消息,直到主进程完成。

ActiveMQ 中的任何内置机制可以做到这一点吗?

4

1 回答 1

0

通常,您一次阅读每个消费者的消息。

您通常有一个如下所示的侦听器:

void onMessage( Message message ) {

     // .. 
     updateExternalAPI(); // Sync. call to external API

 }

因此,当您的onMessage方法结束时,消息将被提交,并且该消费者将继续处理下一条消息。因此,一次只会处理一条消息 - 如果只有一个消费者。

如果您的服务器应用程序只有一个节点,这很容易 - 只需将其配置为仅使用一个使用者。在不同的框架/客户端库中有点不同。

如果你不能这样做和/或有多个节点 - ActiveMQ 提供了一个解决方案。添加?consumer.exclusive=true到客户端中的队列以强制 ActiveMQ 选择单个消费者来向其发送消息。

例子UPDATE.USER.INFO?consumer.exclusive=true

于 2016-01-21T19:59:14.910 回答