【问题标题】:How do I put on hold a message queue如何暂停消息队列
【发布时间】:2016-01-20 13:59:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果我理解正确,您的系统是 [update process] -AMQ-> [adapter] -> [3rd party API],并且您不希望适配器运行,直到您更新过程已将所有消息输入?

标签: asynchronous activemq message subscriber


【解决方案1】:

通常情况下,每个消费者一次阅读一条消息。

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

void onMessage( Message message ) {

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

 }

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

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

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

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

【讨论】:

  • 有一个消费者。但他想要的是,当任意进程运行时,ActiveMQ 将不再释放其队列中的消息。他希望 ActiveMQ 保留这些消息,直到 AMQ 获得“绿灯”
  • 没错。我已经实现了自己的锁定解决方案,但想知道是否有办法向 AMQ 发出信号以锁定单个主题/队列
猜你喜欢
  • 2011-04-22
  • 2015-06-26
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 2016-08-04
  • 2015-06-12
相关资源
最近更新 更多