我有一个要求,当客户端应用在 5 秒的时间跨度内发送超过 1000 个请求时,我需要通过调整(排队)入站流量来限制。
我遵循的解决方案是:我有一个 camel:throttle 将最大请求设置为 1000,时间跨度设置为 5 秒。当超过阈值时,我正在捕获限制异常,并且在 onException 块中,我将限制的消息发送到 ActiveMQ 请求队列以供以后进一步处理,因为 Camel 基于 1000 req/ 5 秒配置过载。
我成功地实现了上述内容,但是我希望让Camel消费者稍后进一步处理,而不是一次处理来自ActiveMQ请求队列的所有消息,而是以10秒的延迟处理每条消息,例如
我无法在 ActiveMQ 中设置参数来表示延迟向消费者发送消息,也无法延迟 Camel 消费者从请求队列中提取消息。
我如何满足我的上述要求
请帮忙
谢谢拉梅什。
在另一个SO线程中,获胜的答案促进了以下解决方案:
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对在任何时间点可以流式传输到消费者的消息数量使用预取限制。达到预取限制后,在使用者开始发回消息确认(以指示消息已处理)之前,不会再向使用者调度消息。实际的预取限制值可以基于每个使用者指定。
您可以启用 ActiveMQ 的计划交付,然后在 Camel Route AMQ_SCHEDULED_DELAY 标头中设置,然后将交换发送到队列。这将导致在消息出现在队列中(即可供使用)之前引入 AMQ_SCHEDULED_DELAY millis 的延迟。
检查这个: http://activemq.apache.org/delay-and-schedule-message-delivery.html