我有一个要求,当客户端应用在5秒的时间跨度内发送超过1000个请求时,我需要通过整形(排队)入站流量来限制。
我遵循的解决方案是: 我有一个骆驼:油门设置最大请求为1000和时间跨度为5秒。当超过阈值时,我正在捕获限制异常,并且在onException块中,我将限制的消息发送到ActiveMQ请求队列,以便稍后根据1000 req / 5 sec config重载Camel进行进一步处理。
我成功实现了上述功能,但是我想让Camel使用者进一步处理,而不是一次性地从ActiveMQ请求队列发出所有消息,而是处理每条消息,例如延迟10秒。
我无法在ActiveMQ中设置一个参数来说明将消息延迟到消费者,也不能延迟Camel消费者从请求队列中取消消息。
我如何满足上述要求
请帮忙
由于 拉梅什。
答案 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