如何从ActiveMQ中延迟消耗Apache Camel中的消息

时间:2016-03-07 07:27:23

标签: apache-camel activemq throttling

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

我遵循的解决方案是: 我有一个骆驼:油门设置最大请求为1000和时间跨度为5秒。当超过阈值时,我正在捕获限制异常,并且在onException块中,我将限制的消息发送到ActiveMQ请求队列,以便稍后根据1000 req / 5 sec config重载Camel进行进一步处理。

我成功实现了上述功能,但是我想让Camel使用者进一步处理,而不是一次性地从ActiveMQ请求队列发出所有消息,而是处理每条消息,例如延迟10秒。

我无法在ActiveMQ中设置一个参数来说明将消息延迟到消费者,也不能延迟Camel消费者从请求队列中取消消息。

我如何满足上述要求

请帮忙

由于 拉梅什。

2 个答案:

答案 0 :(得分: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使用预取限制来确定在任何时间点可以向消费者传输的消息数量。达到预取限制后,在消费者开始发回消息确认(以指示消息已被处理)之前,不再向消费者分派消息。可以基于每个用户指定实际的预取限制值。

答案 1 :(得分:1)

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

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

相关问题