Joe Luo created CAMEL-7338: ------------------------------ Summary: 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
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 the camel exchange IN message body as 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} -- This message was sent by Atlassian JIRA (v6.2#6252)