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

Jms 使用camel指定从activemq队列读取消息的超时,jms,activemq,apache-camel,Jms,Activemq,Apache Camel,我正在使用camel从activemq队列读取消息,对其进行处理并将其发送到另一个队列。路线如下: from("jms:incoming.queue") .process(new MyProcessor()) .to("jms:outgoing.queue"); 我需要指定一个超时,这样,如果“incoming.queue”中没有消息超过3分钟,我想停止路由。我可以使用OnCompletion(),但它会在每条消息之后被调用。我可以指定将消息发送到“outing.queue”的超时时间。是否有

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

from("jms:incoming.queue")
.process(new MyProcessor())
.to("jms:outgoing.queue");
我需要指定一个超时,这样,如果“incoming.queue”中没有消息超过3分钟,我想停止路由。我可以使用OnCompletion(),但它会在每条消息之后被调用。我可以指定将消息发送到“outing.queue”的超时时间。是否有一种方法可以指定一个超时,这样,如果“incoming.queue”中没有消息超过3分钟,我就可以停止路由


提前感谢您的帮助。

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

我可以想到两个选项

  • 使用在指定时间自动启动/停止路线

    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");         
    
  • 使用camel-quartz路由和按计划排空队列

    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);
    }
    

  • 为什么您需要停止不活动超过3分钟的路线?您可以将上次处理时间写入某个位置,并与使用计时器组件推送的其他路由进行检查。@white-要求“incoming.queue”中的消息需要在非工作时间处理,比如晚上8:00。路由需要处理当时队列中的所有消息。处理完所有消息后,需要停止路由,以便在消息第二天开始到达队列时不会立即开始处理消息。路线需要在晚上8:00重新开始。有简单的方法吗?谢谢。我想我可以使用cronscheduledulepolicy来满足我的需求。唯一的问题是,我需要在停止路由之前留出足够的时间,以便处理“incoming.queue”中的所有消息。如果可以指定从队列读取消息的超时时间,并在超时发生时停止路由,则会更好。请参阅我的更新答案…选项2为您提供了对超时端的更多控制,等等。谢谢。我喜欢使用cronscheduledrutepolicy启动和停止路由,因为它更紧凑,并且所有内容都可以指定为单个路由的一部分。