[ 
https://issues.apache.org/activemq/browse/CAMEL-2935?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=60578#action_60578
 ] 

Claus Ibsen commented on CAMEL-2935:
------------------------------------

In fact I am tighten up a bit on the {{ProducerCache}} as well and ensuring the 
javadoc states the contract. 

Now exceptions is not thrown but stored on the returned Exchange which ensures 
a friendly API which caters for both the synchronous and asynchronous routing 
engine in Camel.


> 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
>
>         Attachments: on-failure.patch
>
>
> 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