Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 骆驼聚集策略_Java_Apache Camel - Fatal编程技术网

Java 骆驼聚集策略

Java 骆驼聚集策略,java,apache-camel,Java,Apache Camel,我正在解析一个CSV文件,将其拆分并通过camel中的多个处理器进行路由。有两个端点,一个具有错误数据,而另一个具有验证数据 我需要在汇总数据时提出建议 假设CSV文件有10条记录,其中6条到达一个端点,4条到达另一个端点。我如何知道是否所有10个都已从每个端点的文件中完成,并移到聚合器之前。 我需要创建两个文件,一个包含有效数据,另一个包含来自单个文件的损坏数据。让我们看看拆分器返回的内容 根据Camel 2.2上的文档。或者更早,拆分器将使用您的示例默认返回最后一条拆分消息。这可能是完成其处

我正在解析一个CSV文件,将其拆分并通过camel中的多个处理器进行路由。有两个端点,一个具有错误数据,而另一个具有验证数据

我需要在汇总数据时提出建议

假设CSV文件有10条记录,其中6条到达一个端点,4条到达另一个端点。我如何知道是否所有10个都已从每个端点的文件中完成,并移到聚合器之前。
我需要创建两个文件,一个包含有效数据,另一个包含来自单个文件的损坏数据。

让我们看看拆分器返回的内容

根据Camel 2.2上的文档。或者更早,拆分器将使用您的示例默认返回最后一条拆分消息。这可能是完成其处理器的最后一行,因此可能不是第10行(使用您的示例)

在Camel 2.3及更新版本上,拆分器默认返回原始输入消息,即全部10行。这是默认行为,您无需编写任何代码即可使其正常工作。默认情况下,拆分器完成后,它会将此消息传递到下一个端点

因此,如果我在Camel 2.3或更高版本上使用以下DSL:

<camelContext trace="false" id="blueprintContext" xmlns="http://camel.apache.org/schema/blueprint">
<route id="splitExample">
    <from uri="timer://myTimer?period=2000"/>
    <setBody>
        <simple>A\nB\nC</simple>

    </setBody>

    <log message="The message body before the splitter contains ${body}"/>
    <split>
        <tokenize token="\n"></tokenize>

        <log message="Split line ${body}"/>
    </split>
    <log message="The message body after the splitter contains ${body}"/>
</route>
</camelContext>  
正如您所看到的,默认情况下,在拆分器返回后,camel会将消息合并回一个消息。要覆盖此行为,您需要实现自己的聚合器。为此,创建一个类,让我们调用它
MyAggregationStrategy
,并使该类实现
AggregationStrategy
。我在来自的apache文档中使用了这个示例。例如,我们将聚合传入的出价,并希望聚合最高出价

private static class MyAggregationStrategy implements AggregationStrategy {

    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) 
    {
        if (oldExchange == null) 
        { 
           // the first time we only have the new exchange so it wins the first round
           return newExchange;
        }
        int oldPrice = oldExchange.getIn().getBody(Integer.class);
        int newPrice = newExchange.getIn().getBody(Integer.class);
        // return the "winner" that has the highest price
        return newPrice > oldPrice ? newExchange : oldExchange;
    }
}
完成此操作后,请通过执行以下操作告知拆分器使用聚合器:

Spring/XMLDSL:

<split  strategyRef="MyAggregationStrategy ">
希望这能让您充分了解拆分器的工作原理。在您的情况下,我可能会为每一行设置一个标题值,指示它是成功的还是失败的,然后我将使用我的客户聚合器创建一条新消息,并将失败和成功分组为两个列表作为消息正文。一个列表包含失败的项目,另一个列表包含已完成的行项目


然后可以将这个新的聚合消息发送到处理器或另一个端点进行进一步处理。例如,您可以将失败列表发送到生成文件的路由。
seda
组件在这里可以提供很多帮助。

感谢@Namphibian的详细回复。我对拆分器进行了更深入的研究,并遵循了您的建议,现在一切正常。将其聚合为列表后,我使用自定义处理器,该处理器使用ProducerTemplate将文件路由到不同的目标。再次感谢!!!
<split  strategyRef="MyAggregationStrategy ">
from("direct:start")
// aggregated by header id and use our own strategy how to aggregate
.aggregate(new MyAggregationStrategy())