如何使用Apache Camel触发路由并收集结果?

时间:2015-05-13 21:05:05

标签: java apache-camel jbossfuse

路线A由quartz2组件触发(根据cron计划)。当路由A在某些情况下完成它的业务逻辑时,我需要触发路由B,路由B将从给定目录中读取所有文件并将结果发送到另一个路由C,但不希望路由B始终保持运行。

当路线A需要时,如何只运行路线B一次?目前我在路由A中使用'controlbus:'命令启动路由B(autoStart = false),路由C再次使用'controlbus:'来停止路由B.你能为我的用例提出更好的解决方案吗?

1 个答案:

答案 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 

}