[ https://issues.apache.org/jira/browse/CAMEL-7338?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Willem Jiang reassigned CAMEL-7338: ----------------------------------- Assignee: Willem Jiang > 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 > 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)