This is the new default error handler in Camel 2.0 onwards.
It has the same power as the Dead Letter Channel, however it does not support a dead letter queue, which is the only difference between the two of them.
The DefaultErrorHandler is configured differently from Dead Letter Channel as it is configured to:
no dead letter queue (not possible)
By default, any exception thrown during routing will be propagated back to the caller and the Exchange ends immediately. However, you can use the Exception Clause to catch a given exception and lower the exception by marking it as handled. If so, the exception will not be sent back to the caller, and the Exchange continues to be routed.
In this route below, any exception thrown in, eg the
validateOrder bean, will be propagated back to the caller via the jetty endpoint. It will return an HTTP error message back to the client.
from("jetty:http://localhost/myservice/order") .to("bean:validateOrder") .to("jms:queue:order");
We can add an onException in case we want to catch certain exceptions and route them differently, for instance to catch a ValidationException and return a fixed response to the caller.
onException(ValidationException.class) .handled(true) .transform(body(constant("INVALID ORDER"))); from("jetty:http://localhost/myservice/order") .to("bean:validateOrder") .to("jms:queue:order");
ValidationException is thrown from the
validateOrder bean, it is intercepted by the DefaultErrorHandler that lets the
onException(ValidationException.class) handle it, so the Exchange is routed to this onException route, and since we use
handled(true), then the original exception is cleared, and we transform the message into a fixed response that is returned to jetty endpoint that returns it to the original caller.