指定使用camel从activemq队列读取消息的超时

时间:2012-10-11 17:39:25

标签: jms activemq apache-camel

我使用camel从activemq队列中读取消息,处理它并将其发布到另一个队列。该路线如下:

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

我需要指定一个超时,如果“incoming.queue”中没有消息超过3分钟,我想停止该路由。我可以使用OnCompletion()但它会在每条消息后调用。我可以指定发送消息到“outgoing.queue”的超时。有没有办法可以指定超时,如果“incoming.queue”中没有超过3分钟的消息,我可以停止路由吗?

先谢谢你的帮助。

2 个答案:

答案 0 :(得分: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);
    }
    

答案 1 :(得分:0)

根据您上面的评论,您似乎只是想按计划开始和停止路线。您可以使用石英作业来调用jms路径上的启动和停止方法。如果您愿意,甚至可以使用石英端点使石英逻辑成为路径。