public void process(Exchange exchange) throws Exception {
      TracedRouteNodes traced = exchange.getUnitOfWork().getTracedRouteNodes();

      // get the list of intercepted nodes
      List<RouteNode> list = traced.getNodes();
      // get the 3rd last as its the bean
      Processor last = list.get(list.size() - 3).getProcessor();

      // wrapped by JMX
      if (last instanceof InstrumentationProcessor) {
        InstrumentationProcessor ip = (InstrumentationProcessor) last;
        last = ip.getProcessor();
      }

      // set error message
      exchange.getOut().setFault(true);
      exchange.getOut().setBody("Failed at: " + last.toString());
    }
  /**
   * Creates the {@link ProcessorExchangePair} which holds the processor and exchange to be send
   * out.
   *
   * <p>You <b>must</b> use this method to create the instances of {@link ProcessorExchangePair} as
   * they need to be specially prepared before use.
   *
   * @param index the index
   * @param processor the processor
   * @param exchange the exchange
   * @param routeContext the route context
   * @return prepared for use
   */
  protected ProcessorExchangePair createProcessorExchangePair(
      int index, Processor processor, Exchange exchange, RouteContext routeContext) {
    Processor prepared = processor;

    // set property which endpoint we send to
    setToEndpoint(exchange, prepared);

    // rework error handling to support fine grained error handling
    prepared = createErrorHandler(routeContext, exchange, prepared);

    // invoke on prepare on the exchange if specified
    if (onPrepare != null) {
      try {
        onPrepare.process(exchange);
      } catch (Exception e) {
        exchange.setException(e);
      }
    }
    return new DefaultProcessorExchangePair(index, processor, prepared, exchange);
  }
    public void process(Exchange exchange) throws Exception {
      // Bad Hack - Need to remote it and fix it in Camel (if it's a camel problem)
      // I need to copy the body of the exachange because for some reason
      // the getContext().getEndpoint() erase the content/or loose the reference
      String body = exchange.getIn().getBody(String.class);
      if (dep == null) {

        this.dep = exchange.getContext().getEndpoint(this.droolsUri, DroolsEndpoint.class);
      }

      if (dep == null) {
        throw new RuntimeException("Could not find DroolsEndPoint for uri=" + this.droolsUri);
      }

      ClassLoader originalClassLoader = null;
      try {
        originalClassLoader = Thread.currentThread().getContextClassLoader();

        CommandExecutor exec = dep.executor;
        if (exec == null) {
          String lookup = exchange.getIn().getHeader(DroolsComponent.DROOLS_LOOKUP, String.class);
          if (StringUtils.isEmpty(lookup)) {
            // Bad Hack - Need to remote it and fix it in Camel (if it's a camel problem)
            lookup = dep.getLookup(body);
            // lookup = dep.getLookup( exchange.getIn().getBody( String.class ) );
          }

          if (StringUtils.isEmpty(lookup)) {
            throw new RuntimeException(
                "No Executor defined and no lookup information available for uri "
                    + this.dep.getEndpointUri());
          }
          exec = dep.getCommandExecutor(lookup);
        }

        if (exec == null) {
          throw new RuntimeException(
              "CommandExecutor cannot be found for uri " + this.dep.getEndpointUri());
        }
        ClassLoader localClassLoader = dep.getClassLoader(exec);
        if (localClassLoader == null) {
          throw new RuntimeException(
              "CommandExecutor Classloader cannot be null for uri " + this.dep.getEndpointUri());
        }

        // Set the classloader to the one used by the CommandExecutor
        Thread.currentThread().setContextClassLoader(localClassLoader);
        ExecutionNodePipelineContextImpl context =
            new ExecutionNodePipelineContextImpl(dep.node, localClassLoader);
        context.setCommandExecutor(exec);

        exchange.setProperty("drools-context", context);
        // Bad Hack - Need to remote it and fix it in Camel (if it's a camel problem)
        // I need to re set the Body because the exchange loose the content at
        // the begining of the method
        exchange.getIn().setBody(new ByteArrayInputStream(body.getBytes("UTF-8")));

        boolean soap = false;
        if (!augmented && exchange.getFromEndpoint() instanceof CxfSpringEndpoint) {
          new PreCxfTransportSoapProcessor().process(exchange);
          soap = true;
        }
        processor.process(exchange);
        if (soap) {
          new PostCxfTransportSoapProcessor().process(exchange);
        }
      } finally {
        Thread.currentThread().setContextClassLoader(originalClassLoader);
      }
    }