我有一个批处理路由,它使用文件夹中的XML文件。它会过滤,转换并最终将分组文档保存到磁盘。由于这是一个批处理路由,我要求在单个轮询源文件夹后关闭它,这是下面代码中RouteTerminator的用途。 (它使用stopRoute()
在removeRoute()
上调用camelContext
和routeID
。)
from("file:" + sourcePath)
.filter().xquery("//DateTime > xs:dateTime('2013-05-07T23:59:59')")
.filter().xquery("//DateTime < xs:dateTime('2013-05-09T00:00:00')")
.aggregate(constant(true))
.completionFromBatchConsumer()
.groupExchanges()
.to("xquery:" + xqueryPath)
.to("file:" + targetPath)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
new RouteTerminator(routeID, exchange.getContext()).start();
}
})
.end();
这在单个文件收集后正确关闭路由,并且在onException
中重复该过程后,它还会在抛出异常时正常关闭路由。不幸的是,如果路由过滤掉每个Exchange,它永远不会到达处理器。在过滤器期间交换被丢弃,路线保持打开状态。
我想在aggregate
调用中移动过滤器,因为这可能会使路由一直持续到最后,但此方法不会接受XQuery过滤器。 XPath不是一个选项,因为它不支持dateTime比较。
在这种情况下,如何强制停止整个路线?
答案 0 :(得分:1)
我再次尝试,现在有一个解决方案,我调用setHeader来设置Filtered标头。
不幸的是,我似乎无法选择将其用作简单的开关/案例,因此我必须将.when()和.otherwise()路由到相同的第二个直接路由。
在该路由中,然后我聚合并调用一个基本的合并bean,它从每个Exchange构建一个Document,并在头部匹配时将其添加到GenericFile。似乎应该有一种更简单的方法来简单地设置基于xquery的标题,但是......