过滤所有邮件时停止路由

时间:2013-05-08 12:36:46

标签: java xquery apache-camel

我有一个批处理路由,它使用文件夹中的XML文件。它会过滤,转换并最终将分组文档保存到磁盘。由于这是一个批处理路由,我要求在单个轮询源文件夹后关闭它,这是下面代码中RouteTerminator的用途。 (它使用stopRoute()removeRoute()上调用camelContextrouteID。)

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比较。

在这种情况下,如何强制停止整个路线?

1 个答案:

答案 0 :(得分:1)

  

我再次尝试,现在有一个解决方案,我调用setHeader来设置Filtered标头。

     

不幸的是,我似乎无法选择将其用作简单的开关/案例,因此我必须将.when()和.otherwise()路由到相同的第二个直接路由。

     

在该路由中,然后我聚合并调用一个基本的合并bean,它从每个Exchange构建一个Document,并在头部匹配时将其添加到GenericFile。似乎应该有一种更简单的方法来简单地设置基于xquery的标题,但是......