2012-10-11 94 views
2

我正在使用camel从activemq队列中读取消息,对其进行处理并将其发布到另一个队列中。路线如下所示:使用camel指定从activemq队列读取消息的超时

from("jms:incoming.queue") 
.process(new MyProcessor()) 
.to("jms:outgoing.queue"); 

我需要是否有“incoming.queue”超过3分钟内没有消息指定超时这样,我想停止路线。我可以使用OnCompletion(),但它会在每条消息之后调用。我可以指定发送消息到“outgoing.queue”的超时时间。有没有一种方法可以指定超时时间,如果在“incoming.queue”中没有超过3分钟的消息,我可以停止路由?

在此先感谢您的帮助。

+0

为什么你需要停止超过3分钟不活动的路线?您可以在最后一次处理时间的地方写入,并使用其他路径按计时器组件进行检查。 – white

+0

@white - 要求在“incoming.queue”中的消息需要在下班时间处理,例如晚上8:00 PM。此时路由需要处理队列中的所有消息。一旦处理完所有消息,就需要停止路由,以便它在第二天开始抵达队列时就不开始处理消息。路线需要在晚上8点重新开始。有没有简单的方法来做到这一点? – Sathish

回答

0

根据上面的评论,看起来你只是想按计划开始和停止路线。您可以使用石英作业来调用jms路径上的开始和停止方法。如果你喜欢,你甚至可以使用石英端点来制作石英逻辑。

我能想到的
+0

谢谢。我喜欢使用CronScheduledRoutePolicy来启动和停止路由,因为它更紧凑一些,并且可以将所有内容都指定为单个路由的一部分。 – Sathish

3

两个选项...

  1. 使用CronScheduledRoutePolicy启动/在指定时间自动停止路线......

    CronScheduledRoutePolicy myPolicy = new CronScheduledRoutePolicy(); 
    myPolicy.setRouteStartTime("0 20 * * * ?"); 
    myPolicy.setRouteStopTime("0 0 * * * ?"); 
    
    from("jms:incoming.queue") 
        .routePolicy(myPolicy).noAutoStartup() 
        .process(new MyProcessor()) 
        .to("jms:outgoing.queue");   
    
  2. 使用骆驼石英路线和一个polling consumer按计划排空队列

    MyCoolBean cool = new MyCoolBean(); 
    cool.setProducer(template); 
    cool.setConsumer(consumer); 
    
    from("quartz://myGroup/myTimerName?cron=0+20+*+*+*+?") 
        .bean(cool); 
    
    //MyCoolBean snippet 
    while (true) { 
        // receive the message from the queue, wait at most 60s 
        Object msg = consumer.receiveBody("jms:incoming.queue", 60000); 
        if (msg == null) { 
         break; 
        } 
        producer.sendBody("jms:outgoing.queue", msg); 
    } 
    
+0

谢谢。我想我可以使用CronScheduledRoutePolicy来满足我的要求。唯一的是我需要在停止路由之前留出足够的时间,以便处理“incoming.queue”中的所有消息。如果可以指定从队列中读取消息的超时时间并且如果超时发生时停止路由将会好得多。 – Sathish

+0

看到我更新的答案...选项#2给你更多的控制超时端等 –

+0

谢谢。这很酷。 – Sathish

相关问题