2
votes

Camel isn't propagating exceptions when they are thrown inside of a multicast.

Given the following setup where direct:route throws an exception from its beanRef:

        rest("/...")
        .post()
        .consumes("application/json")
        .produces("application/json")
        .route()
            .onException(Exception.class)
                .handled(true)
                .bean("exceptionHandler")
                .marshal("exceptionDataFormat")
            .end()
            .unmarshal("dataFormat")
            ...
            .enrich("direct:services", new ServiceAggregator())
            .to("direct:anotherRoute")
            ...
        .end()
    .endRest();


    from("direct:services")
        .errorHandler(noErrorHandler())
        .multicast()
        .setAggregationStrategy(new GroupedExchangeAggregationStrategy())
        .executorServiceRef("executor")
        .parallelAggregate()
        .streaming()
        .stopOnException()
            .to("direct:route")
        .end()
    .end();

    from("direct:route")
        .errorHandler(noErrorHandler())
        .bean("someRef", "someMethod")
    .end();

Instead of allowing the exception handler to consume the exchange and process the error, I get the following exception immediately returned (to SoapUI):

org.apache.camel.CamelExchangeException: Parallel processing failed for number 0. Exchange[...] at org.apache.camel.processor.MulticastProcessor$1.call(MulticastProcessor.java:328)
at org.apache.camel.processor.MulticastProcessor$1.call(MulticastProcessor.java:299)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

and the parent route ends with that exception and no exception handling.

If direct:anotherRoute were to throw an exception, that exception is handled correctly.

Why can't I propogate multicast exceptions to the parent route ?

Camel 2.17-SNAPSHOT

2

2 Answers

5
votes

Turn on the shareUnitOfWork option on the multicast. See more details at: http://camel.apache.org/multicast and there is an example on the splitter which also has this option: http://camel.apache.org/splitter.html

0
votes

Try to use

.errorHandler(noErrorHandler()) 

in parent and child routes which will propagate the exceptions to onexception()