2

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

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

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

提前感谢您的帮助。

4

2 回答 2

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. 使用骆驼石英路由和轮询消费者按计划排空队列

    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);
    }
    
于 2012-10-11T21:40:56.807 回答
0

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

于 2012-10-11T19:54:01.910 回答