Как получить инкрементный индекс, т. Е. Использовать во время цикла () в RouteBuilder?

Вопрос: Как получить инкрементный индекс, т. Е. Использовать во время loop() в RouteBuilder, чтобы итеративные вызовы "direct:thingC" "обрабатывали" последующие элементы (в массиве)?

Вот метод 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

Решение: согласно предложению Алессандро, ниже


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}
}

1 ответ

Решение

Не используйте петлю. Из документов:

Цикл позволяет обрабатывать сообщение несколько раз, возможно, по-разному для каждой итерации. Полезно в основном во время тестирования.
Режим по умолчанию
Обратите внимание, что по умолчанию в цикле используется один и тот же обмен. Таким образом, результат предыдущей итерации будет использован для следующего

Поскольку вы хотите обрабатывать отдельные элементы чего-то, что вы можете "зациклить", установите это как тело и используйте вместо этого 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()

Сплиттер "сломает" List на отдельные части и обрабатывать все в цикле.

В общем, избегайте static поля, если они являются входными или выходными данными. В этом случае лучше установить их как тело, например, используя Processor бин, который устанавливает желаемые данные.

Другие вопросы по тегам