Witam,
od jakiegoś czasu pracuję z książką Camel in action. Jestem na etapie wzorców integracyjnych, a dokładnie Slit Router.
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&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&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.