[ 
https://issues.apache.org/activemq/browse/SM-1473?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=44432#action_44432
 ] 

Manuel EVENO commented on SM-1473:
----------------------------------

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

{code:java}
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));
                        }
                }
        }
}
{code}

And setting it to the deadLetterChannel as the final endpoint :

{code:java}
                deadLetterChannel.setDefaultDeadLetterEndpoint(new 
ErrorProcessor());
{code}




> Camel Service Engine Component not handling error from Camel processing
> -----------------------------------------------------------------------
>
>                 Key: SM-1473
>                 URL: https://issues.apache.org/activemq/browse/SM-1473
>             Project: ServiceMix
>          Issue Type: Bug
>          Components: servicemix-camel
>    Affects Versions: 3.2.1, 3.2.2
>         Environment: ServiceMix 3.2.1
> ServiceMix-Camel 3.2.2-SNAPSHOT
> Camel 1.4-SNAPSHOT
>            Reporter: Manuel EVENO
>
> 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

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to