ServiceMix Components
  1. ServiceMix Components
  2. SMXCOMP-348

Camel Service Engine Component not handling error from Camel processing

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 3.2.1, 3.2.2
    • Component/s: servicemix-camel
    • Labels:
      None
    • Environment:

      ServiceMix 3.2.1
      ServiceMix-Camel 3.2.2-SNAPSHOT
      Camel 1.4-SNAPSHOT

      Description

      When an exception occured in camel processor, the message exchange is sent back to the NMR without taking care of its failed status.
      ServiceMix MessageExchange ends in Done status instead of Error.

      The probably incorrect code is in CamelJbiEndpoint.handleActiveProviderExchange() :
      After calling "camelProcessor.process(camelExchange);", the method sould have a look at camelExchange.isFailed()
      and filling exchange with correct status and exception before calling "send(exchange);".

      http://svn.apache.org/repos/asf/servicemix/components/engines/servicemix-camel/trunk/src/main/java/org/apache/servicemix/camel/CamelJbiEndpoint.java

        Activity

        Hide
        Manuel EVENO added a comment -

        A possible workaround consists in creating an ErrorProcessor that handles status :

        public final class ErrorProcessor implements Processor {
        	
        	private static final Logger logger = Logger.getLogger(ErrorProcessor.class);
        	
        	public void process(Exchange exchange) throws Exception {
        		if (logger.isDebugEnabled()) {
        			logger.debug("Trying to find an exception in property: " + DeadLetterChannel.EXCEPTION_CAUSE_PROPERTY);
        		}
        		Throwable exception = (Throwable) exchange.getProperty(DeadLetterChannel.EXCEPTION_CAUSE_PROPERTY);
        		if (exception != null) {
        			exchange.setException(exception);
        		} else {
        			logger.debug("Trying to find an exception using: DeadLetterChannel.restoreExceptionOnExchange()");
        			DeadLetterChannel.restoreExceptionOnExchange(exchange);
        		}
        		exception = exchange.getException();
        		if (logger.isDebugEnabled()) {
        			logger.debug("Exchange exception is " + exception);
        			logger.debug("Exchange.isFailed()=" + exchange.isFailed());
        		}
        		if (exception != null && exchange instanceof JbiExchange) {
        			logger.info("An exception has occured, setting ServiceMix messageExchange status to Error");
        			MessageExchangeImpl messageExchange = (MessageExchangeImpl) ((JbiExchange) exchange).getMessageExchange();
        			messageExchange.setStatus(ExchangeStatus.ERROR);
        			if (exception instanceof Exception) {
        				messageExchange.setError((Exception)exception);
        			} else {
        				messageExchange.setError(new Exception(exception));
        			}
        		}
        	}
        }
        

        And setting it to the deadLetterChannel as the final endpoint :

        		deadLetterChannel.setDefaultDeadLetterEndpoint(new ErrorProcessor());
        
        Show
        Manuel EVENO added a comment - A possible workaround consists in creating an ErrorProcessor that handles status : public final class ErrorProcessor implements Processor { private static final Logger logger = Logger.getLogger(ErrorProcessor.class); public void process(Exchange exchange) throws Exception { if (logger.isDebugEnabled()) { logger.debug( "Trying to find an exception in property: " + DeadLetterChannel.EXCEPTION_CAUSE_PROPERTY); } Throwable exception = (Throwable) exchange.getProperty(DeadLetterChannel.EXCEPTION_CAUSE_PROPERTY); if (exception != null ) { exchange.setException(exception); } else { logger.debug( "Trying to find an exception using: DeadLetterChannel.restoreExceptionOnExchange()" ); DeadLetterChannel.restoreExceptionOnExchange(exchange); } exception = exchange.getException(); if (logger.isDebugEnabled()) { logger.debug( "Exchange exception is " + exception); logger.debug( "Exchange.isFailed()=" + exchange.isFailed()); } if (exception != null && exchange instanceof JbiExchange) { logger.info( "An exception has occured, setting ServiceMix messageExchange status to Error" ); MessageExchangeImpl messageExchange = (MessageExchangeImpl) ((JbiExchange) exchange).getMessageExchange(); messageExchange.setStatus(ExchangeStatus.ERROR); if (exception instanceof Exception) { messageExchange.setError((Exception)exception); } else { messageExchange.setError( new Exception(exception)); } } } } And setting it to the deadLetterChannel as the final endpoint : deadLetterChannel.setDefaultDeadLetterEndpoint( new ErrorProcessor());
        Hide
        Guillaume Nodet added a comment -

        Sending src/main/java/org/apache/servicemix/camel/CamelJbiEndpoint.java
        Sending src/test/java/org/apache/servicemix/camel/JbiInOnlyTest.java
        Transmitting file data ..
        Committed revision 691630.

        Show
        Guillaume Nodet added a comment - Sending src/main/java/org/apache/servicemix/camel/CamelJbiEndpoint.java Sending src/test/java/org/apache/servicemix/camel/JbiInOnlyTest.java Transmitting file data .. Committed revision 691630.
        Hide
        Ron Gavlin added a comment -

        Would it be possible to also commit this fix to the smx 3.2.x branch?

        Show
        Ron Gavlin added a comment - Would it be possible to also commit this fix to the smx 3.2.x branch?
        Hide
        Guillaume Nodet added a comment -

        Fix for 3.2 branch

        Sending servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelJbiEndpoint.java
        Transmitting file data .
        Committed revision 691885.

        Show
        Guillaume Nodet added a comment - Fix for 3.2 branch Sending servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelJbiEndpoint.java Transmitting file data . Committed revision 691885.

          People

          • Assignee:
            Guillaume Nodet
            Reporter:
            Manuel EVENO
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development