如何暂停消息队列

时间:2016-01-20 13:59:05

标签: asynchronous activemq message subscriber

简化的


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

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

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

ActiveMQ中的任何内置机制都可以这样做吗?

1 个答案:

答案 0 :(得分:0)

通常,您每个消费者都会阅读一条消息。

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

void onMessage( Message message ) {

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

 }

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

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

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

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