You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by "aum.struts" <au...@gmail.com> on 2011/08/31 10:00:14 UTC

Error Handling In Camel

Hi All,

While working with Camel i have a requirement where i need to validate an
XML with a given XSD and in case of validation faliure need to stop the
process and notify user about valdation failed

First part is working fine for the validation as i am using camel out of the
box validator
and i have declared a global Exception handler in my spring.xml file with
the following entry

<onException useOriginalMessage="true">
	    <exception>org.apache.camel.ValidationException</exception>
	    <exception>org.xml.sax.SAXParseException</exception>
	   
<exception>org.apache.camel.processor.validation.SchemaValidationException</exception>    
	    <exception>java.lang.Exception</exception>
	    <handled>
      		<constant>false</constant>
    	</handled>
	  	<process ref="exceptionHandler"/>
	  	to uri="file://data/failed" /
   </onException>

where exceptionHandler is my custom Exceptionhandler 

public class AdapterExceptionHandler implements Processor {

	IAdapterManager adapterManager;
	
	public void setAdapterManager(IAdapterManager adapterManager) {
		this.adapterManager = adapterManager;
	}

	public void process(Exchange exchange) throws Exception {
		ExceptionBean exeB = new ExceptionBean();		
		System.out.println(exchange.getProperty("************
"+Exchange.EXCEPTION_CAUGHT,Throwable.class));
       	exeB.setExceptionObj(exchange.getException());
		System.out.println("Excahange adapterManager---------"+adapterManager);
		ManagerStateBean mgrStateBean = null;
		if (adapterManager.getAdapterMgrState() != null) {
			mgrStateBean=adapterManager.getAdapterMgrState();
		}else{
			mgrStateBean = new ManagerStateBean();
		}
		mgrStateBean.setExecutionStatus(AdapterConstants.ExceptionOccurred);
		mgrStateBean.setExceptionData(exeB);		
		adapterManager.setAdapterMgrState(mgrStateBean);		
	}

But when validation getting failed camel is giving the control back to
AdapterExceptionHandler but Exchange is coming as null since when i am
trying to fetch exception object from it it is coming as null

though on the console it is showing the DefaultErrorHandler is handling the
exception but i am clueless how i can forward the exception to my
"AdapterExceptionHandler "

here is the console output

[thread #1 - file://data/input/] DefaultValidationErrorHandler  DEBUG
Validation error: org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The
content of element 'record' is not complete. One of '{element}' is expected.
org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content of
element 'record' is not complete. One of '{element}' is expected.
	at
com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown
Source)[:1.6.0_26]

[thread #1 - file://data/input/] DefaultErrorHandler            DEBUG Failed
delivery for exchangeId: ID-snsln-045-51580-1314777491191-0-28. On delivery
attempt: 0 caught:
org.apache.camel.processor.validation.SchemaValidationException: Validation
failed for:
com.sun.org.apache.xerces.internal.jaxp.validation.SimpleXMLSchema@1d2b8e
errors: [org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content
of element 'record' is not complete. One of '{element}' is expected.,
org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content of
element 'record' is not complete. One of '{element}' is expected.,
org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content of
element 'record' is not complete. One of '{element}' is expected.].
Exchange[null]
Excahange INNNNNNNNNNNnull
Excahange INNNNNNNNNNNCamelFailureEndpoint
Excahange INNNNNNNNNNNCamelFailureHandled
null
null

can any one help me out how can i pass the Exception to my 
"AdapterExceptionHandler"

Thanks in advance

--
View this message in context: http://camel.465427.n5.nabble.com/Error-Handling-In-Camel-tp4753284p4753284.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: Error Handling In Camel

Posted by Travis Klotz <tr...@gmail.com>.
i think the problem is that you have:

System.out.println(exchange.getProperty("************
"+Exchange.EXCEPTION_CAUGHT,Throwable.class));

and what you actually want is:

System.out.println("************ " +
exchange.getProperty(Exchange.EXCEPTION_CAUGHT,Throwable.class));

Travis

On Thu, Sep 1, 2011 at 12:41 PM, aum.struts <au...@gmail.com> wrote:
> But in that case this lines should give the exception details
>
> System.out.println(exchange.getProperty("************
>> "+Exchange.EXCEPTION_CAUGHT,Throwable.class));
>
> but it is giving output as 'null"
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/Error-Handling-In-Camel-tp4753284p4759333.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>

Re: Error Handling In Camel

Posted by "aum.struts" <au...@gmail.com>.
But in that case this lines should give the exception details

System.out.println(exchange.getProperty("************
> "+Exchange.EXCEPTION_CAUGHT,Throwable.class)); 

but it is giving output as 'null"

--
View this message in context: http://camel.465427.n5.nabble.com/Error-Handling-In-Camel-tp4753284p4759333.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: Error Handling In Camel

Posted by Claus Ibsen <cl...@gmail.com>.
The caused exception is stored as a property on the Exchange using the key
Exchange.EXCEPTION_CAUGHT



On Wed, Aug 31, 2011 at 10:00 AM, aum.struts <au...@gmail.com> wrote:
> Hi All,
>
> While working with Camel i have a requirement where i need to validate an
> XML with a given XSD and in case of validation faliure need to stop the
> process and notify user about valdation failed
>
> First part is working fine for the validation as i am using camel out of the
> box validator
> and i have declared a global Exception handler in my spring.xml file with
> the following entry
>
> <onException useOriginalMessage="true">
>            <exception>org.apache.camel.ValidationException</exception>
>            <exception>org.xml.sax.SAXParseException</exception>
>
> <exception>org.apache.camel.processor.validation.SchemaValidationException</exception>
>            <exception>java.lang.Exception</exception>
>            <handled>
>                <constant>false</constant>
>        </handled>
>                <process ref="exceptionHandler"/>
>                to uri="file://data/failed" /
>   </onException>
>
> where exceptionHandler is my custom Exceptionhandler
>
> public class AdapterExceptionHandler implements Processor {
>
>        IAdapterManager adapterManager;
>
>        public void setAdapterManager(IAdapterManager adapterManager) {
>                this.adapterManager = adapterManager;
>        }
>
>        public void process(Exchange exchange) throws Exception {
>                ExceptionBean exeB = new ExceptionBean();
>                System.out.println(exchange.getProperty("************
> "+Exchange.EXCEPTION_CAUGHT,Throwable.class));
>        exeB.setExceptionObj(exchange.getException());
>                System.out.println("Excahange adapterManager---------"+adapterManager);
>                ManagerStateBean mgrStateBean = null;
>                if (adapterManager.getAdapterMgrState() != null) {
>                        mgrStateBean=adapterManager.getAdapterMgrState();
>                }else{
>                        mgrStateBean = new ManagerStateBean();
>                }
>                mgrStateBean.setExecutionStatus(AdapterConstants.ExceptionOccurred);
>                mgrStateBean.setExceptionData(exeB);
>                adapterManager.setAdapterMgrState(mgrStateBean);
>        }
>
> But when validation getting failed camel is giving the control back to
> AdapterExceptionHandler but Exchange is coming as null since when i am
> trying to fetch exception object from it it is coming as null
>
> though on the console it is showing the DefaultErrorHandler is handling the
> exception but i am clueless how i can forward the exception to my
> "AdapterExceptionHandler "
>
> here is the console output
>
> [thread #1 - file://data/input/] DefaultValidationErrorHandler  DEBUG
> Validation error: org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The
> content of element 'record' is not complete. One of '{element}' is expected.
> org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content of
> element 'record' is not complete. One of '{element}' is expected.
>        at
> com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown
> Source)[:1.6.0_26]
>
> [thread #1 - file://data/input/] DefaultErrorHandler            DEBUG Failed
> delivery for exchangeId: ID-snsln-045-51580-1314777491191-0-28. On delivery
> attempt: 0 caught:
> org.apache.camel.processor.validation.SchemaValidationException: Validation
> failed for:
> com.sun.org.apache.xerces.internal.jaxp.validation.SimpleXMLSchema@1d2b8e
> errors: [org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content
> of element 'record' is not complete. One of '{element}' is expected.,
> org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content of
> element 'record' is not complete. One of '{element}' is expected.,
> org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content of
> element 'record' is not complete. One of '{element}' is expected.].
> Exchange[null]
> Excahange INNNNNNNNNNNnull
> Excahange INNNNNNNNNNNCamelFailureEndpoint
> Excahange INNNNNNNNNNNCamelFailureHandled
> null
> null
>
> can any one help me out how can i pass the Exception to my
> "AdapterExceptionHandler"
>
> Thanks in advance
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/Error-Handling-In-Camel-tp4753284p4753284.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>



-- 
Claus Ibsen
-----------------
FuseSource
Email: cibsen@fusesource.com
Web: http://fusesource.com
Twitter: davsclaus, fusenews
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/