Java 过滤所有邮件时停止路由
我有一个使用文件夹中的XML文件的批处理路由。它过滤、转换并最终将分组文档保存到磁盘。由于这是一个批处理路由,我要求在对sourcefolder进行一次轮询后将其关闭,这就是RouteTerminator在下面的代码中的作用。(它使用Java 过滤所有邮件时停止路由,java,xquery,apache-camel,Java,Xquery,Apache Camel,我有一个使用文件夹中的XML文件的批处理路由。它过滤、转换并最终将分组文档保存到磁盘。由于这是一个批处理路由,我要求在对sourcefolder进行一次轮询后将其关闭,这就是RouteTerminator在下面的代码中的作用。(它使用routeID在camelContext上调用stopRoute()和removoute()) from(“文件:”+sourcePath) .filter().xquery(//DateTime>xs:DateTime('2013-05-07T23:59:59')
routeID
在camelContext
上调用stopRoute()和removoute()
)
from(“文件:”+sourcePath)
.filter().xquery(//DateTime>xs:DateTime('2013-05-07T23:59:59'))
.filter().xquery(//DateTime
这将在单个文件收集后正确关闭路由,并在重复onException
中的过程后,在引发异常时也会正常关闭路由。不幸的是,如果路由过滤掉了每个交换,它就永远不会到达处理器。交换在过滤过程中被丢弃,路由保持打开
我想将过滤器移动到aggregate
调用中,因为这可能会使路由一直运行到最后,但此方法不接受XQuery过滤器。XPath不是一个选项,因为它不支持日期时间比较
在这种情况下,我如何强制整个路线停止
我再试了一次,现在有了一个解决方案,我调用setHeader来设置一个过滤的头
不幸的是,我似乎无法选择将其用作简单的开关/案例,因此我必须将.when()和.otherwise()路由到相同的第二个直接路由
然后,在该路径中,我聚合并调用一个基本的合并bean,该bean从每个交换中构建一个文档,并在头匹配的情况下将其添加到GenericFile中。似乎应该有一种更简单的方法来简单地基于xquery设置头
我发现了一种非常简单的方法,将一条伪造的记录插入到bean中的exchange中,然后在我调用的XQuery中过滤掉这条记录,但我显然更喜欢一种更干净的方法。与其使用过滤器,您是否考虑过使用CHOICEpredicate@Joe2013我试过了,但效果不太好。在您的评论之后,我再次尝试,现在有了一个解决方案,我调用setHeader
来设置过滤的
标题。不幸的是,我似乎无法突破选项
将其用作简单的开关/案例,因此我必须将.when()
和路由到相同的第二条直接路由。然后,在该路径中,我聚合并调用一个基本的合并bean,该bean从每个交换中构建一个文档,并在头匹配的情况下将其添加到GenericFile中。似乎应该有一种更简单的方法来简单地基于xquery设置头。。。
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();