Apache Camel - Slit Router EIP

0

Witam,

od jakiegoś czasu pracuję z książką Camel in action. Jestem na etapie wzorców integracyjnych, a dokładnie Slit Router.

Slit Router
Apache Camel

Zrozumiałem, iż działa on w następujący sposób: mogę zdefiniować w mojej wiadomości nagłówek, który określi sekwencję KOLEJNO wykonywanych endpointów. Czyli moja wiadomość zostaje dostarczona do pierwszego z endpointów. Jest w nim przetwarzana, a wynik trafia do kolejnego endpointu itd.
Postanowiłem, iż moje endpointy przyjmą postać kolejek (komponent ActiveMq, który wywołuję lokalnie) i w ramach routa wiadomość zostanie przetworzona.

public class FirstNameProcessor {

    public FirstNameFormat process(FirstNameFormat firstNameFormat){

        firstNameFormat.setFirstName( firstNameFormat.getFirstName() + " bla");
        return firstNameFormat;
    }
}

<!--definicja komponentu activemq-->
<bean class="org.apache.activemq.camel.component.ActiveMQComponent" id="myACTIVEMQ">
    <property name="brokerURL" value="tcp://localhost:61616"/>
    <property name="trustAllPackages" value="true"/>
</bean>

<!--kilka rzeczy nieważnych z punktu widzenia problemu-->

<route>
      <from uri="myACTIVEMQ:queue:firstName"/>
      <unmarshal ref="myFormat"/>

<!--obiekt POJO. Klasa FirstName, która posiada jedno pole private String firstName-->

      <setHeader headerName="mySplit">
        <constant>myACTIVEMQ:queue:one;myACTIVEMQ:queue:second</constant>
      </setHeader>
      <routingSlip uriDelimiter=";">
        <header>mySplit</header>
      </routingSlip>
    </route>

    <route>
      <from uri="myACTIVEMQ:queue:one"/>
      <unmarshal ref="myAgregationFormat"/>
      <bean ref="firstNameProcessor" method="process"/>
      <to uri="log:afterFirstChange?showBody=true&amp;showBodyType=true"/>
    </route>

    <route>
      <from uri="myACTIVEMQ:queue:second"/>
      <to uri="log:secondQueue?showAll=true"/>
      <unmarshal ref="myAgregationFormat"/>
      <bean ref="firstNameProcessor" method="process"/>
      <to uri="log:afterSecondChange?showBody=true&amp;showBodyType=true"/>
    </route>

Sytuacja jest taka, że wspomniany obiekt POJO wysyłany jest równolegle do obu routów, a nie o to mi chodzi. Pomiędzy obieka kolejkami nie ma żadnej transakcji. Początkowo myślałem, że problem tkwi w tym, że przetwarzana wiadomość jest InOnly. Zmodyfikowałem więc kod w następujący sposób:

 <setHeader headerName="mySplit">
        <constant>myACTIVEMQ:queue:one?exchangePattern=InOut;myACTIVEMQ:queue:second</constant>
      </setHeader>

lecz nie przyniosło to rezultatów.

0

Teraz gdy w nagłówku ustawiłem:

<setHeader headerName="mySplit">
        <constant>bean:firstNameProcessor?method=processor;bean:firstNameProcessor?method=processor</constant>
</setHeader>

działa poprawnie. Otrzymałem wynik Michał bla bla. Nie wiem na czym pojega różnica. Z góry dziekuje za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1