【问题标题】:How to delay consuming messages in Apache Camel from ActiveMQ如何从 ActiveMQ 延迟使用 Apache Camel 中的消息
【发布时间】:2016-06-20 16:22:59
【问题描述】:

当客户端应用在 5 秒的时间内发送超过 1000 个请求时,我需要通过整形(排队)入站流量来节流。

我遵循的解决方案是: 我有一个骆驼:油门将最大请求设置为 1000,将时间跨度设置为 5 秒。当超过阈值时,我正在捕获节流异常,并且在 onException 块内,我会将节流消息发送到 ActiveMQ 请求队列以供以后进一步处理,因为 Camel 基于 1000 req/5 sec 配置过载。

我成功地实现了上述操作,但是我想让 Camel 消费者稍后进一步处理不是一次性处理来自 ActiveMQ 请求队列的所有消息,而是以 10 秒的延迟处理每条消息,例如

我无法在 ActiveMQ 中设置参数来延迟向消费者发送消息,也不能延迟 Camel 消费者从请求队列中拉出消息。

如何满足我的上述要求

请帮忙

谢谢 拉梅什。

【问题讨论】:

    标签: apache-camel activemq throttling


    【解决方案1】:

    您可以启用 ActiveMQ 的计划交付,然后在您的 Camel Route AMQ_SCHEDULED_DELAY 标头中设置,然后将您的交换发送到队列。这将导致在消息出现在队列中之前引入 AMQ_SCHEDULED_DELAY 毫秒的延迟(即可供消费)。

    检查这个:http://activemq.apache.org/delay-and-schedule-message-delivery.html

    【讨论】:

      【解决方案2】:

      在另一个 SO thread 中,获奖答案促进了以下解决方案:

      from("activemq:queueA").throttle(10).to("activemq:queueB")
      

      对我来说,这个解决方案只有在您定义预取限制时才有意义,否则消费者不会关心任何下游限制。这条路线应该可行:

      from("activemq:queueA?&destination.consumer.prefetchSize=10").throttle(10).to("activemq:queueB")
      

      这是它背后的理论,来自http://activemq.apache.org/what-is-the-prefetch-limit-for.html

      因此,ActiveMQ 对在任何时间点可以将多少条消息流式传输给消费者使用了预取限制。一旦达到预取限制,就不会再向消费者发送消息,直到消费者开始发送回消息确认(以指示消息已被处理)。可以根据每个消费者指定实际的预取限制值。

      【讨论】:

      • 嗨 Fritz...感谢您的回复...我想设置延迟间隔而不是一次获取 x 条消息你能帮忙解决这个用例吗?
      • 只需将 prefetchSize 设置为 1。您使用的预取的重要特性是消费者等待进一步消费,直到最后获取的消息被确认。
      猜你喜欢
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多