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

Reply via email to