You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (JIRA)" <ji...@apache.org> on 2015/07/09 12:12:05 UTC

[jira] [Resolved] (CAMEL-8675) Aggregators swallow exceptions

     [ https://issues.apache.org/jira/browse/CAMEL-8675?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen resolved CAMEL-8675.
--------------------------------
    Resolution: Not A Problem

The aggregator runs in separate output route that is not assoicated with the inputs.

> Aggregators swallow exceptions
> ------------------------------
>
>                 Key: CAMEL-8675
>                 URL: https://issues.apache.org/jira/browse/CAMEL-8675
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>    Affects Versions: 2.12.2
>            Reporter: Jostein Gogstad
>              Labels: aggregator
>
> Processors attached to aggregators can not throw exceptions, they will be swallowed. This makes it impossible to propagate exceptions from camel to, for instance, a CXF endpoint or custom JAX-WS service.
> This route and test illustrates the problem:
> {code:java|title=AggregatorBug.java}
> public class AggregatorBug extends RouteBuilder {
>     @Override
>     public void configure() throws Exception {
>         from("direct:start")
>             .routeId(getClass().getSimpleName())
>             .aggregate().header("cheese")
>             .aggregationStrategy(new GroupedExchangeAggregationStrategy())
>             .completionSize(1)
>             .process(new Processor() {
>                 @Override
>                 public void process(Exchange exchange) throws Exception {
>                     throw new RuntimeException();
>                 }
>             });
>     }
> }
> {code}
> {code:java|title=AggregatorBugTest.java}
> public class AggregatorBugTest extends CamelTestSupport {
>     @EndpointInject(uri = "mock:beforeException")
>     protected MockEndpoint beforeException;
>     @Override
>     public boolean isUseAdviceWith() {
>         return true;
>     }
>     @Override
>     protected RouteBuilder createRouteBuilder() throws Exception {
>         return new AggregatorBug();
>     }
>     @Override
>     protected void doPostSetup() throws Exception {
>         context.getRouteDefinition(AggregatorBug.class.getSimpleName()).adviceWith(context, new AdviceWithRouteBuilder() {
>             @Override
>             public void configure() throws Exception {
>                 weaveByType(ProcessDefinition.class).before().to("mock:beforeException");
>             }
>         });
>         context.start();
>     }
>     @Test
>     public void exceptions_are_swallowed() throws Exception {
>         try {
>             template.sendBodyAndHeader("direct:start", 42, "cheese", "foo");
>             fail("Expected exception");
>         } catch (CamelExecutionException e) {
>             beforeException.expectedMessageCount(1);
>         }
>     }
> }
> {code}
> From what I can see, the problem is located in [AggregatorProcessor|https://github.com/apache/camel/blob/camel-2.12.x/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java#L247] (github link). The output from {{doAggregate}} is ignored, even though it contains the exchange with the exception. The exchange that is used from here on out is the original input to the route, not the aggregated output. 
> The only way I can see that would trigger the exception would be to add a custom errorHandler that re-throwed the exception. Unfortunately this is also impossible. The {{errorHandler}} on {{AggregatorProcessor}} is set in the constructor, and there is no API to set the errorHandler from {{AggregatorDefinition}}. The errorHandler set on the route is also ignored by {{AggregatorProcessor}} (it will though be invoked with the original not-aggregated exchange).
> This problem has been reported earlier in CAMEL-1546. The proposed solution with using a seda route is not satisfactory for cxf endpoints since the calling thread would return.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)