Activemq ApacheCamel:异步延迟,延迟程序运行不正常

Activemq ApacheCamel:异步延迟,延迟程序运行不正常,activemq,apache-camel,Activemq,Apache Camel,我目前正在编写一个死信队列来处理路由中发生的异常。在死信队列中,我计划将每条消息延迟1天(或任何其他长时间)。我编写的代码目前正确地延迟了消息,只是没有异步延迟,消息最终会在等待之前延迟的消息等待其延迟期结束时得到备份 <route> <from uri="activemq:queue:foo"/> <delay asyncDelayed="true"> <constant> 60000 </constant>

我目前正在编写一个死信队列来处理路由中发生的异常。在死信队列中,我计划将每条消息延迟1天(或任何其他长时间)。我编写的代码目前正确地延迟了消息,只是没有异步延迟,消息最终会在等待之前延迟的消息等待其延迟期结束时得到备份

<route>
   <from uri="activemq:queue:foo"/>
   <delay asyncDelayed="true">
       <constant> 60000 </constant>
   </delay>
   <to uri="activemq:aDelayedQueue"/>
</route>

60000
我了解到asyncDelayed=“true”应该计划将来执行的任务,以处理路由的后半部分,除非我尝试运行上述代码,否则消息最终会备份到foo队列中,而对于aDelayedQueue,一次一个地滴入1

它为什么会这样做?有什么办法可以解决这个问题吗

谢谢

EDIT,我找到了一个解决方法,但我很想看看最初出了什么问题。

重新编写问题。以下是我的队列管道的外观:

QueueA->QueueB->QueueC


QueueB提取队列A中的消息。目标是让每条消息在发送到QueueC之前在QueueB中停留X个时间。上面的代码片段已放置在QueueB中。我面临的问题是,如果5条消息同时到达QueueA,QueueB只会拉入其中一条消息,等待60秒,然后将该消息发送到QueueC。我的预期功能是将所有5条消息放在QueueB上,在一次全部放在QueueC上之前,它们将在那里停留60秒。最初的问题是消息开始在QueueA中堆积,因为QueueB正在等待延迟。

JMS客户端路由逐个处理消息,而不是并行处理。只有当一条消息离开队列时,下一个队列才能进入路由。因此,如果一条消息被延迟,则不会从JMS队列读取其他消息

除了解决方法之外,您还可以并行化您的路线:

<route>
    <from uri="activemq:queue:foo"/>
    <to uri="seda:delayer"/>
</route>

<route>
    <from uri="seda:delayer?concurrentConsumers=1000"/>
    <delay asyncDelayed="true">
         <constant> 60000 </constant>
    </delay>
    <to uri="activemq:aDelayedQueue"/>
</route>

60000

但是,即使您的客户端路由关闭,您的变通方法
AMQ\u SCHEDULED\u DELAY
也更加健壮,请参阅。

我遇到了完全相同的问题,只是路由是vm路由,而不是activemq路由。因此,以下路由定义将同步阻塞:

from("vm:a").
    throttle(1).asyncDelayed(). 
        to("vm:b");
但是,当我添加
maximumRequestsPerPerPerPerPeriod
值时,它按预期工作:

from("vm:a").
    throttle(1).asyncDelayed().maximumRequestsPerPeriod(100L).
        to("vm:b");

如果您没有提供MaximumRequestsPerPerPerPerPeriod值,它似乎不会对请求进行排队,从而阻止了调用方。

请您重新表述您的问题,我不明白。嗨,Peter,我没有检查stackoverflow响应的习惯,因此,对于延迟响应,我深表歉意。通过在标题中设置AMQ_SCHEDULED_DELAY属性,我找到了一个解决方法。然而,我很想知道我最初的方法到底出了什么问题。我在原始问题中添加了一个编辑。