【问题标题】:Is there any way for STOMP - Activemq client to stop consuming messages until required?STOMP - Activemq 客户端有什么方法可以在需要之前停止使用消息?
【发布时间】:2020-12-27 02:02:45
【问题描述】:

我在带有 ActiveMQ 的 node.js 上使用 stomp client。目前,生产者将消息推送到队列中,如果客户端(消费者)已连接,则它会使用该消息。如果客户端未连接,则消息将在队列中挂起,直到或除非某个消费者已连接。

就我而言,消费者执行的每个操作都很昂贵,可能需要长达 2 小时。我想使用一条消息,然后停止使用队列中的消息,直到该操作完成。目前,一旦消息被推送到队列中,客户端会自动从队列中提取所有消息。我想要的是拉一条消息等待其完成,然后再次从队列中拉,依此类推。这是为了避免竞争条件。

例如,如果我在队列中有三个任务: 一个 |乙| C

当前的流程是所有消息都在队列中被消费,队列为空。

我想要的是消费 1 条消息,即

一个 |乙| (消耗C)

在 C 上执行操作。

消费者完成所有操作后,接收下一条消息

一个 | (B被消耗)

等等……

我使用 ActiveMQ 进行通信的原因是,如果节点应用程序崩溃或我的服务器关闭等情况,它可以可靠地传递消息。

【问题讨论】:

  • @JustinBertram 正在使用的包是npmjs.com/package/stomp-client
  • @JustinBertram 目前,一旦消息被推送到队列中,客户端会自动从队列中提取所有消息。我想要的是拉一条消息。等待它完成,然后再次从队列中拉取,依此类推。
  • 你使用的是什么版本的 ActiveMQ?

标签: node.js activemq stomp


【解决方案1】:

使用基于ActiveMQ 5 的解决方案,客户端可以配置代理将使用可用消息填充的预取大小。如果您在 STOMP 订阅上使用 activemq.prefetchSize 标头并将值设置为 1,假设您使用了客户端或客户端个人确认模式,代理将一次发送一条消息。在您的情况下,您可以使用客户端确认,然后在处理完消息后发送 ACK,如果有消息,代理将发送另一条消息。

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 2011-12-24
    • 2020-10-04
    • 2018-03-27
    • 2015-10-29
    • 2012-07-15
    • 2012-06-30
    • 2016-10-19
    • 1970-01-01
    相关资源
    最近更新 更多