Jms 使用camel指定从activemq队列读取消息的超时
我正在使用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”的超时时间。是否有
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");
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启动和停止路由,因为它更紧凑,并且所有内容都可以指定为单个路由的一部分。