camel-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Willem Jiang (JIRA)" <j...@apache.org>
Subject [jira] [Resolved] (CAMEL-7338) CxfClientCallback should not populate camel exchange OUT message if no response comes back to cxf producer and camel exchange pattern is InOnly
Date Tue, 15 Apr 2014 03:21:14 GMT

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

Willem Jiang resolved CAMEL-7338.
---------------------------------

       Resolution: Fixed
    Fix Version/s: 2.14.0
                   2.13.1
                   2.12.4

Applied patch into camel master, camel-2.13.x and camel-2.12.x branches with thanks to Joe.

> CxfClientCallback should not populate camel exchange OUT message if no response comes
back to cxf producer and camel exchange pattern is InOnly
> -----------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-7338
>                 URL: https://issues.apache.org/jira/browse/CAMEL-7338
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-cxf
>    Affects Versions: 2.10.4
>            Reporter: Joe Luo
>            Assignee: Willem Jiang
>             Fix For: 2.12.4, 2.13.1, 2.14.0
>
>         Attachments: patch.txt
>
>
> I have a following camel route:
> {code}
> String destination = "cxf:http://localhost:9090/test?dataFormat=MESSAGE";
>     from("jms:queue:dslSource")
>         .onException(java.net.ConnectException.class, Exception.class)
>             .maximumRedeliveries(3)
>             .maximumRedeliveryDelay(3000)
>             .retryAttemptedLogLevel(LoggingLevel.INFO)
>             .log(LoggingLevel.WARN, "Failed to send message ${body}") 
>             .log(LoggingLevel.WARN, "Sending message to the error queue: ${body}")  
       // body is null here
>             .to("jms:queue:dslError")
>             .end()
>         .log(LoggingLevel.INFO, "Sending message ...")
>         .setHeader("bridgeDestination", constant(destination))
>         .to(destination)
>         .log(LoggingLevel.INFO, "received back: ${body}")
>         .routeId("example-dsl");
> {code}
> If an exception is thrown, for instance, a ConnectionException due to unavailability
of the backend web service, the onException() route will be executed. The first log endpoint:
> {code}
> .log(LoggingLevel.WARN, "Failed to send message ${body}") 
> {code}
> prints out camel exchange IN message body without any problem. However, the second log
endpoint:
> {code}
> .log(LoggingLevel.WARN, "Sending message to the error queue: ${body}")
> {code}
> only prints out a "null".
> The reason is that when an exception is thrown, the CxfClientCallback.handleException()
is called:
> {code}
> public void handleException(Map<String, Object> ctx, Throwable ex) {
>     ....
>         if (!boi.getOperationInfo().isOneWay()) {
>             // copy the InMessage header to OutMessage header                 
>             camelExchange.getOut().getHeaders().putAll(camelExchange.getIn().getHeaders());
>             binding.populateExchangeFromCxfResponse(camelExchange, cxfExchange, ctx);
>             camelAsyncCallback.done(false);
>         }
> ...
> {code}
> and this line always populates camel exchange OUT message regardless whether there is
a CXF response back or not:
> {code}
> camelExchange.getOut().getHeaders().putAll(camelExchange.getIn().getHeaders());
> {code}
> Therefore, the second log endpoint within onException() block has it's camel exchange
IN message been overwritten and replaced with OUT message from previous endpoint's although
it is a message of NULL body.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Mime
View raw message