I have had the need to be able to control routes from different
routes quite a number of times (both in Mule and Camel). Typically
this is useful if you would like to be able to remotely control your
routes using any of the available transports. Yes, some might say
that you have JMX available to do this and even if your
administrators do not want to open up any new ports on the test
environment you can always overload a port already being used by the
ESB and proxy for example the MX4J interface, however that is a
different story.
But why not control your routes using the same way as you interact
with your application. If you are sending JMS messages to your
application, why not have a queue which receives control messages. Or
if you are using web services, why not expose a web service which
will allow you to control the routes. This is one beauty of an ESB,
you have so much flexibility when it comes to transports to use.
So what I did for camel was create a simple bean, which will
perform the control action (START, STOP, RESUME, SUSPEND) on a
specific route depending on the Route Id.
The bean has two attributes, routeId and action which can be set
to give the bean a default value and a method which takes an Exchange
as parameter which is the entry point. From the exchange we attempt
to get headers "IntegrationCocktail.RouteController.RouteId" and
"IntegrationCocktail.RouteController.Action". If these headers
are not set, we use the defaults set directly on the bean. Finally,
depending on the action we simply call
context.startRoute/stopRoute/resumeRoute/suspendRoute(routeId).
To use this bean, you can choose to either give it static
behaviour by setting the attributes on the bean, or dynamically by
setting the appropriate message headers. The source code is availale
on the integration-cocktail github repository and I created a
camel-tools project where I will be putting such tit bits. For examples for how to use this bean you can look at the tests.
Finally, a question that inquisitive readers might ask is, will it
be possible to stop or suspend the current route? Can you use this
bean to for example stop the current route when an exception is
thrown? Technically, it will work but not elegantly since by default
the DefaultShutdownStrategy kicks in to enforce a graceful shutdown which
will wait for all in flight exchanges to finish. However, the current
exchange which initiated the stop request is still in flight so you
will end up waiting until the timeout. We will polish the behaviour
of the RouteController for such situations in another post.
Until then, feel free to to suggest other possible ”tools” for
both Camel and Mule either by commenting on the post or at
integrationcocktail@google.com.
No comments:
Post a Comment