How can I stop a route from a route
The CamelContext provides API for managing
routes at runtime. It has a stopRoute(id)
and startRoute(id)
methods.
Stopping a route during routing an existing message is a bit tricky. The reason for that is Camel will Graceful Shutdown the route you are stopping. And if you do that while a message is being routed the Graceful Shutdown will try to wait until that message has been processed.
The best practice for stopping a route from a route, is to either:
-
signal to another thread to stop the route
-
spin off a new thread to stop the route
Using another thread to stop the route is also what is normally used when stopping Camel itself, or for example when an application in a server is stopped etc. Its too tricky and hard to stop a route using the same thread that currently is processing a message from the route. This is not advised to do, and can cause unforeseen side effects.
Using a latch to stop Camel from a route
In this example we use a CountdownLatch
to signal when Camel should
stop, triggered from a route.
And in the route we call the latch as shown:
Using a thread to stop a route from a route
In this example we use a separate Thread
to stop the route, triggered
from the route itself.
And in the route we create the thread and call the stopRoute
method as
shown:
Alternative solutions
Camel provides another feature for managing routes at runtime which is RoutePolicy.
And CamelContext also provides API for suspend/resume of routes, and shutdown as well.
-
suspend/resume is faster than stop/start. For example a HTTP server will still run but deny any incoming requests. Whereas if it was stopped the HTTP listener would have been stopped.
-
shutdown means the route is being removed from CamelContext and cannot be started again. Its also removed from JMX. A route must have been stopped prior to be shutdown.
See more details about the Lifecycle.
You can also use the ControlBus component to let it stop/start routes. |