Broken failure reporting via DefaultProucerTemplate.asyncCallback and 
Synchronization.onFailure
-----------------------------------------------------------------------------------------------

                 Key: CAMEL-2935
                 URL: https://issues.apache.org/activemq/browse/CAMEL-2935
             Project: Apache Camel
          Issue Type: Bug
          Components: camel-core
    Affects Versions: 2.3.0
            Reporter: Martin Krasser
             Fix For: 2.4.0


The recent change in {{ProducerCache.send}}

{code:java|title=ProducerCache.java}
    public void send(Endpoint endpoint, Exchange exchange) {
        try {
            sendExchange(endpoint, null, null, exchange);
            // RECENT CHANGE HERE:
            // ensure that CamelExecutionException is always thrown
            if (exchange.getException() != null) {
                exchange.setException(wrapCamelExecutionException(exchange, 
exchange.getException()));
            }
        } catch (Exception e) {
            throw wrapCamelExecutionException(exchange, e);
        }
    }
{code}

that throws a {{CamelExecutionException}} if {{exchange.getException}} is not 
null, makes it impossible for {{DefaultProducerTemplate.asyncCallback}} to 
report failures (other than fault messages) asynchronously via 
{{Synchronization.onFailure}}

{code:java|title=DefaultProducerTemplate.java}
    public Future<Exchange> asyncCallback(final Endpoint endpoint, final 
Exchange exchange, final Synchronization onCompletion) {
        Callable<Exchange> task = new Callable<Exchange>() {
            public Exchange call() throws Exception {

                // FIXME: exception is thrown in Camel 2.4 where a normal 
return with answer.getException != null was done in Camel 2.3
                Exchange answer = send(endpoint, exchange);

                if (answer.isFailed()) {
                    onCompletion.onFailure(answer);
                } else {
                    // ...
                }
                return answer;
            }
        };
        // ...
    }
{code}

This was working in Camel 2.3 (but unfortunately there wasn't any test case for 
it). I attached a patch for {{DefaultProducerTemplateAsyncTest}} that 
demonstrates the problem. I didn't commit a fix yet because I'm unsure at the 
moment about the best way to fix that. Of course I tried a naive fix in the 
DefaultProducerTemplate.asyncCallback methods which causes the test (in the 
patch) to pass but I'd like to hear other opinions before I continue.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to