Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-4945

CXF Producer calls done method of Camel callback several times

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 2.8.3, 2.9.0
    • 2.8.5, 2.9.1, 2.10.0
    • camel-cxf
    • None
    • Patch Available
    • Novice

    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

      { super.handleResponse(ctx, res); }

      finally {
      // bind the CXF response to Camel exchange
      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 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());
      }
      }
      }

      Attachments

        1. CAMEL-4945.patch
          2 kB
          Stefan Boller

        Activity

          People

            njiang Willem Jiang
            stefanbo72 Stefan Boller
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: