Java 过滤所有邮件时停止路由

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')

我有一个使用文件夹中的XML文件的批处理路由。它过滤、转换并最终将分组文档保存到磁盘。由于这是一个批处理路由,我要求在对sourcefolder进行一次轮询后将其关闭,这就是RouteTerminator在下面的代码中的作用。(它使用
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();