Параллельная обработка весеннего сплиттера Apache Camel с агрегатором xml не работает, как в Java DSL

Что было бы эквивалентно xml для приведенного ниже java DSL, пожалуйста, предложите

 public class OrderRouter1 extends RouteBuilder {

@Override
public void configure() throws Exception {

    from("direct:processOrder")
        .split(body().method("getItems"), new OrderItemStrategy())
        .parallelProcessing()
        .to("direct:processItem")
     .end();


    from("direct:processItem")
        .choice()
            .when(body().method("getType").isEqualTo("Book"))
                .to("bean:itemService?method=processBook").
            otherwise()
                .to("bean:itemService?method=processPhone");
}

}

Я попытался использовать приведенную ниже конфигурацию xml без использования агрегатора, но когда я включаю параллельную обработку, она работает последовательно.

 <camelContext id="orderCtx" xmlns="http://camel.apache.org/schema/spring">
   <route>
        <from uri="direct:processOrder" />
        <split parallelProcessing="true">
        <simple>${body}</simple>
            <to uri="direct:processItem" />
        </split>

    </route>

    <route>
        <from uri="direct:processItem" />
            <bean beanType="com.apache.camel.aggregrator.ItemSvc" method="processBook"/>
            <bean beanType="com.apache.camel.aggregrator.ItemSvc" method="processPhone"/>
        </route>


</camelContext>

person Madhusudhan G Revankar    schedule 24.03.2017    source источник


Ответы (2)


я бы предложил следующее изменение в верхнем маршруте "processOrder"

<split parallelProcessing="true">
    <simple>${body.getItems}</simple>
    <to uri="direct:processItem" />
</split>

если вы хотите снова использовать свою AggregationStrategy, вы можете добавить strategyRef="yourBean" в сплиттер

person Japu_D_Cret    schedule 24.03.2017
comment
Спасибо, Джапу, да, я могу добавить его и проверить, но моя проблема связана с конфигурацией xml, мне нужно, чтобы он работал так же, как java dsl работает параллельно - person Madhusudhan G Revankar; 24.03.2017
comment
вы должны попробовать это, я думаю, что это разделялось последовательно, потому что вы не вызывали метод getItems() в своем контексте Spring-Camel, и поэтому вы пытались разделить все тело, которое, вероятно, не может быть разделено и поэтому передается как есть - person Japu_D_Cret; 24.03.2017
comment
да. Я пытался посмотреть документацию, как мы можем записать ее в xml, но не смог получить правильные ссылки для перехода или чтения. - person Madhusudhan G Revankar; 24.03.2017
comment
@MadhusudhanGRevankar, возможно, стоит посмотреть camel.apache.org/simple.html#Simple-OGNLexpressionsupport< /а> - person Japu_D_Cret; 24.03.2017
comment
после вышеуказанных изменений он по-прежнему работает последовательно - person Madhusudhan G Revankar; 24.03.2017
comment
работало ли ранее упомянутое решение Java DSL последовательно? и как определить, что на самом деле это не работает параллельно — то, что элементы обрабатываются последовательно, не означает, что они не могут обрабатываться параллельно. это может быть просто совпадение, что один за другим заканчивается. или вы на 100% уверены, что первый обрабатывается, потом завершается и только после этого обрабатывается следующий? - person Japu_D_Cret; 24.03.2017
comment
да, я добавил некоторую задержку в одном процессе. С DSL он работает отлично, так как он не работает последовательно. - person Madhusudhan G Revankar; 25.03.2017

Наконец, я смог получить эквивалентный java DSL для XML, и он работает так, как ожидалось.

<bean id="orderItemStrategy" class="com.apache.camel.aggregrator.OrderItemStrategy" />
<bean id="itemService" class="com.apache.camel.aggregrator.ItemSvc" />
<camelContext id="orderCtx" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:processOrder" />
        <split parallelProcessing="true" strategyRef="orderItemStrategy">
            <simple>${body.getItems}</simple>
            <to uri="direct:processItem" />
        </split>
    </route>
    <route>
        <from uri="direct:processItem" />
         <choice>
        <when>
            <simple>${body.getType} == 'Book'</simple>
           <to uri="bean:itemService?method=processBook" />
        </when>
         <otherwise>
           <to uri="bean:itemService?method=processPhone" />
        </otherwise>
    </choice>
    </route>
</camelContext>
person Madhusudhan G Revankar    schedule 25.03.2017