这件事给我带来了很大的麻烦。给这只猫剥皮的方法有很多种,据我所知,没有一种方法很好。
On 是设置路线不自动开始,并使用时间表启动路线,然后使用 controlbus EIP 在短时间内再次停止。 http://camel.apache.org/controlbus.html
我不喜欢这种方法,因为我不相信它会完全耗尽队列一次,并且每个触发器只有一次。
另一种是使用pollEnrich 查询队列,但这似乎只从队列中取出一个项目,但我想完全排空它(仅一次)。
我编写了一个自定义 bean,它使用消费者和生产者模板来读取队列中具有指定超时的所有条目。
我在网上某处找到了一个例子,但是我花了很长时间才找到,然后快速搜索我现在找不到它。
所以我拥有的是:
from("timer:myTimer...")
.beanRef( "myConsumerBean", "pollConsumer" )
from("direct:myProcessingRoute")
.to("whatever");
还有一个简单的pollConsumer 方法:
public void pollConsumer() throws Exception {
if ( consumerEndpoint == null ) consumerEndpoint = consumer.getCamelContext().getEndpoint( endpointUri );
consumer.start();
producer.start();
while ( true ) {
Exchange exchange = consumer.receive( consumerEndpoint, 1000 );
if ( exchange == null ) break;
producer.send( exchange );
consumer.doneUoW( exchange );
}
producer.stop();
consumer.stop();
}
生产者是DefaultProducerTemplate,消费者是DefaultConsumerTemplate,这些都在bean配置中配置。
这似乎对我有用,但如果有人给你一个更好的答案,我会非常有兴趣看看如何做得更好。