路线A由quartz2组件触发(根据cron计划)。当路由A在某些情况下完成它的业务逻辑时,我需要触发路由B,路由B将从给定目录中读取所有文件并将结果发送到另一个路由C,但不希望路由B始终保持运行。
当路线A需要时,如何只运行路线B一次?目前我在路由A中使用'controlbus:'命令启动路由B(autoStart = false),路由C再次使用'controlbus:'来停止路由B.你能为我的用例提出更好的解决方案吗?
答案 0 :(得分:0)
'路线A'实现池消费者,它从给定目录中轮询所有文件(当我们迭代时)。当我们收到null body时,轮询将被停止(检查http://camel.apache.org/file2.html sendEmptyMessageWhenIdle选项)
public void process(Exchange exchange) throws Exception {
List<GenericFile> result = new ArrayList<GenericFile>();
String endpointUrl = "file:////tmp?sendEmptyMessageWhenIdle=true"
PollingConsumer pConsumer = camelContext.getEndpoint(endpointUrl).createPollingConsumer();
pConsumer.start();
GenericFile<File> gFile;
do {
Exchange ex = pConsumer.receive(SCAN_TIMEOUT);
gFile = (GenericFile<File>) ex.getIn().getBody();
if(gFile != null) {
result.add(gFile);
}
// use &sendEmptyMessageWhenIdle=true in file endpoint url OR set receive timeouts otherwise you will never know when folder scan has finished !!!
} while(gFile != null);
pConsumer.stop();
// other business logic
}