Camel riders, I've got a route that makes use of the Routing Slip EIP. Right now, a processor is used to create the header to be used with the routingSlip processor. Once that is done, the routingSlip then passes the messages on to one or more ActiveMQ queues as targets.
It was my understanding that the Routing Slip EIP is supposed to take a message and send it to each destination synchronously (i.e. go to destination "A", then destination "B", and so on until all of the destinations in the routing slip header are visited, or an exception occurs). However, during my experimentation, I've seen that the routing slip processor seems to happily "fulfill" its duties by sending to all of the destinations near simultaneously if the destinations are ActiveMQ queues. Here's my RouteBuilder: /*..*/ getContext().addInterceptStrategy(new Tracer()); from("activemq:results") .unmarshal(bufFormatter) .bean(RoutingSlipCreator.class) /* adds "activemq:foo, etc. as needed" .routingSlip("routingSlip"); from("activemq:foo") .bean(Foo.class); from("activemq:bar") .bean(Bar.class); from("activemq:baz") .bean(Baz.class); from("activemq:quux") .bean(Quux.class); And here's an example of the tracer tracing this interaction (I've deleted the contents of the body for brevity): DefaultMessageListenerContainer-1 INFO [org.apache.camel.processor.interceptor.Tracer] - ID:xyzzy.ateb.com-52179-1273613387168-2:5:1:1:1 >>> (route1) --> com.ateb.dataproc.obc_processor.processor.postcontact.routingslipcrea...@407e75d2 <<< Pattern:InOnly, Headers:{JMSPriority=4, JMSDeliveryMode=2, JMSMessageID=ID:xyzzy.ateb.com-52179-1273613387168-2:5:1:1:1, JMSCorrelationID=null, JMSRedelivered=false, JMSTimestamp=1273613390576, JMSType=null, JMSReplyTo=null, underTest=true, JMSDestination=queue://results, JMSXGroupID=null, JMSExpiration=0}, BodyType:java.util.HashMap, Body:{ ... } DefaultMessageListenerContainer-1 INFO [org.apache.camel.processor.interceptor.Tracer] - ID:xyzzy.ateb.com-52179-1273613387168-2:5:1:1:1 >>> (route1) com.ateb.dataproc.obc_processor.processor.postcontact.routingslipcrea...@407e75d2 --> routingSlip[routingSlip] <<< Pattern:InOnly, Headers:{JMSDeliveryMode=2, routingSlip=activemq:foo,activemq:bar,activemq:baz,activemq:quux, JMSMessageID=ID:xyzzy.ateb.com-52179-1273613387168-2:5:1:1:1, JMSDestination=queue://results, JMSRedelivered=false, underTest=true, JMSPriority=4, JMSTimestamp=1273613390576, JMSCorrelationID=null, JMSType=null, JMSReplyTo=null, JMSXGroupID=null, JMSExpiration=0}, BodyType:java.util.HashMap, Body:{ ... } DefaultMessageListenerContainer-1 INFO [org.apache.camel.processor.interceptor.Tracer] - ID:xyzzy.ateb.com-52179-1273613387168-2:7:1:2:1 >>> (route3) from(activemq://bar) --> com.ateb.dataproc.obc_processor.processor.postcontact....@1ee2433b <<< Pattern:InOnly, Headers:{JMSCorrelationID=null, CamelJmsDeliveryMode=2, underTest=true, JMSType=null, JMSXGroupID=null, JMSTimestamp=1273613391428, JMSExpiration=0, JMSDestination=queue://bar, JMSReplyTo=null, JMSRedelivered=false, JMSMessageID=ID:xyzzy.ateb.com-52179-1273613387168-2:7:1:2:1, JMSPriority=4, JMSDeliveryMode=2, routingSlip=activemq:baz,activemq:quux}, BodyType:java.util.HashMap, Body:{ ... } DefaultMessageListenerContainer-1 INFO [org.apache.camel.processor.interceptor.Tracer] - ID:xyzzy.ateb.com-52179-1273613387168-2:7:1:3:1 >>> (route4) from(activemq://baz) --> com.ateb.dataproc.obc_processor.processor.postcontact....@5809fdee <<< Pattern:InOnly, Headers:{JMSTimestamp=1273613391434, JMSXGroupID=null, CamelJmsDeliveryMode=2, JMSMessageID=ID:xyzzy.ateb.com-52179-1273613387168-2:7:1:3:1, JMSPriority=4, routingSlip=activemq:quux, JMSDeliveryMode=2, JMSExpiration=0, JMSReplyTo=null, JMSType=null, JMSRedelivered=false, JMSDestination=queue://baz, JMSCorrelationID=null, underTest=true}, BodyType:java.util.HashMap, Body:{ ... } DefaultMessageListenerContainer-1 INFO [org.apache.camel.processor.interceptor.Tracer] - ID:xyzzy.ateb.com-52179-1273613387168-2:7:1:1:1 >>> (route2) from(activemq://foo) --> com.ateb.dataproc.obc_processor.processor.postcontact....@43ce663c <<< Pattern:InOnly, Headers:{JMSXGroupID=null, JMSPriority=4, JMSDeliveryMode=2, CamelJmsDeliveryMode=2, JMSTimestamp=1273613391410, JMSExpiration=0, JMSType=null, JMSCorrelationID=null, underTest=true, JMSReplyTo=null, JMSDestination=queue://foo, routingSlip=activemq:bar,activemq:baz,activemq:quux, JMSRedelivered=false, JMSMessageID=ID:xyzzy.ateb.com-52179-1273613387168-2:7:1:1:1}, BodyType:java.util.HashMap, Body:{...} DefaultMessageListenerContainer-1 INFO [org.apache.camel.processor.interceptor.Tracer] - ID:xyzzy.ateb.com-52179-1273613387168-2:7:1:4:1 >>> (route5) from(activemq://quux) --> com.ateb.dataproc.obc_processor.processor.postcontact.q...@34cef6f1 <<< Pattern:InOnly, Headers:{underTest=true, JMSMessageID=ID:xyzzy.ateb.com-52179-1273613387168-2:7:1:4:1, CamelJmsDeliveryMode=2, routingSlip=, JMSTimestamp=1273613391450, JMSDeliveryMode=2, JMSXGroupID=null, JMSExpiration=0, JMSDestination=queue://quux, JMSRedelivered=false, JMSPriority=4, JMSReplyTo=null, JMSType=null, JMSCorrelationID=null}, BodyType:java.util.HashMap, Body:{ ...} So, what am I to do here? The reason I have these broken out into separate queues is to be able to break up the transactions; some of the processors require outside resources (Webservices, for example) which may be down or problematic. I'd like to be able to deal with that gracefully should any one of the processes fail without having to repeat the pieces of the routing slip that have been successfully dealt with. But more troubling to me is that the DSL makes it extremely easy to write an "implementation" of the Routing Slip EIP which doesn't work like a routing slip at all. Is there any way to fix my route so it works? Do I have to make all of my exchanges InOut, perhaps? Help! Thanks, Scott