如何获得可递增的索引 - 即,在 RouteBuilder 的 loop() 期间使用?

How can an incrementable index be obtained - i.e., to use during a loop() in RouteBuilder?

问题: 如何获得可递增索引 - 即,在 loop() 中使用RouteBuilder - 以便对 "direct:thingC" 的迭代调用将 "process" 后续元素(在数组列表中)?

这是configure()方法...

    private final org.apache.camel.Processor proc1 = new Processor1();
    private static final List<String> searchList = Arrays.asList("AA", "BB");
    private static final int z = searchList.size();
    private static int x = 0;    

    //***idea is to both elements using an index during the "loop".... Not working....

    @Override
    public void configure() throws Exception {

    from("timer://foo?fixedRate=true&period=" + 5000) //5 seconds...            
        .to("direct:thingB");

    from("direct:thingB")
        .log("---------------------- (from(\"direct:thingB\"))... ----------x=" + x)
        .loop(searchList.size()).to("direct:thingC");

    from("direct:thingC")
        .log("---------------------- (from(\"direct:thingC\"))... ----------searchList.get(" + x++ + ")=" + searchList.get(x));
    }

日志输出看起来像这样(索引不递增:总是选择相同的元素)... :-(

2017-09-01 16:13:19,142 | INFO  | 43 - timer://foo | route15                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingB"))... ----------x=0
2017-09-01 16:13:19,142 | INFO  | 43 - timer://foo | route16                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=BB
2017-09-01 16:13:19,143 | INFO  | 43 - timer://foo | route16                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=BB
2017-09-01 16:13:24,141 | INFO  | 43 - timer://foo | route15                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingB"))... ----------x=0
2017-09-01 16:13:24,141 | INFO  | 43 - timer://foo | route16                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=BB
2017-09-01 16:13:24,142 | INFO  | 43 - timer://foo | route16                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=BB

目标是 - 而不是 - 有这样的输出....

2017-09-01 16:13:19,142 | INFO  | 43 - timer://foo | route15                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingB"))... ----------x=0
2017-09-01 16:13:19,142 | INFO  | 43 - timer://foo | route16                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=AA
2017-09-01 16:13:19,143 | INFO  | 43 - timer://foo | route16                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(1)=BB
2017-09-01 16:13:24,141 | INFO  | 43 - timer://foo | route15                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingB"))... ----------x=0
2017-09-01 16:13:24,141 | INFO  | 43 - timer://foo | route16                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=AA
2017-09-01 16:13:24,142 | INFO  | 43 - timer://foo | route16                          | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(1)=BB

解决方法:按照Alessandro的建议,如下


private final String s = "AA,BB";

@Override
public void configure() throws Exception {

    from("timer://foo?fixedRate=true&period=" + 5000) //5 seconds... 
            .setBody(constant(s))            
            .to("direct:thingB")

    from("direct:thingB")
            .split().tokenize(",")
            .to("direct:thingC");       

    from("direct:thingC")
            .log("body=" + body());  //note: this value looks like simple{AA}
}

不要使用 loop。来自文档:

The Loop allows for processing a message a number of times, possibly in a different way for each iteration. Useful mostly during testing.
Default mode
Notice by default the loop uses the same exchange throughout the looping. So the result from the previous iteration will be used for the next

由于您想处理可以 "loop" 处理的单个元素,请将其设置为正文并改用 split

from("timer://foo?fixedRate=true&period=" + 5000) //5 seconds...            
    setBody(searchList)
    .to("direct:thingB");

from("direct:thingB")
    .split()
        .simple("${body}")
        .log("This is element: ${body} [Element number ${exchangeProperties.CamelSplitIndex} of ${exchangeProperties.CamelSplitSize} total elements]")
    .end()

Splitter 将 "break" 将 List 分成单个部分并循环处理所有部分。

一般来说,如果它们是输入或输出数据,请避免使用 static 字段。在这种情况下,最好将它们设置为正文,例如使用设置所需数据的 Processor bean。