Details
Description
If the CXF Producer of Camel is called asynchronously for a WS-RM endpoint, Camel receives multiple final events, like ExchangeCompletedEvent and ExchangeFailedEvent. This leads also to negative JMX counters for inflight exchanges. The root cause is a bug in the handleResponse and handleException methods of org.apache.camel.component.cxf.CxfClientCallback. In those methods, which are called for WS-RM communication, although it is oneway, the done method of camelAsyncCallback is called also for oneway exchanges. However this callback method is already called in the process method of org.apache.camel.component.cxf.CxfProducer for oneway exchanges, which causes the mentioned effects.
The following changes in org.apache.camel.component.cxf.CxfClientCallback can fix this:
public void handleResponse(Map<String, Object> ctx, Object[] res) {
try
finally {
// bind the CXF response to Camel exchange
if (!boi.getOperationInfo().isOneWay())
if (LOG.isDebugEnabled()) {
LOG.debug("{} calling handleResponse", Thread.currentThread().getName());
}
}
}
public void handleException(Map<String, Object> ctx, Throwable ex) {
try { super.handleException(ctx, ex); camelExchange.setException(ex); } finally {
// copy the context information
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); }
if (LOG.isDebugEnabled()) {
LOG.debug("{} calling handleException", Thread.currentThread().getName());
}
}
}