You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@servicemix.apache.org by "Manuel EVENO (JIRA)" <ji...@apache.org> on 2008/07/22 11:18:00 UTC

[jira] Commented: (SM-1473) Camel Service Engine Component not handling error from Camel processing

    [ 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.