Results 1 to 4 of 4

Thread: Error handling

  1. #1

    Default Error handling

    Hello,

    I am new to Spring Integration and trying to play with the error handling piece of the framework. For a background I have a big flow consisting splitters, aggregators, transformers, routers etc.. and all happy paths are working fine and now I want to add the error handling capabilities like explained in one of the recent seminar. I added an error channel followed by transformer to my starting gateway. So when any runtime exception happens in my flow I get a Messaging Exception back with a cause set to an actual exception in my transformer. But the strange thing is if I remove that error channel and by that the error flow, my actual run time exception gets propagated to the caller and not the MessagingException. And what I read was Framework always wraps all the exceptions to a MessagingException.
    Please correct me if I am wrong and provide some insight in error handling. And what should be a best practice to handle runtime exceptions with Spring Integration?

  2. #2
    Join Date
    Mar 2010
    Location
    Gtr Philadelphia, PA
    Posts
    2,021

    Default

    It depends on the signature of your gateway method.

    If you declare a method that, say, throws FooException; the gateway will try to unwrap it for you. If not, you'll get the MessagingException.
    Gary P. Russell
    Spring Integration Team
    SpringSource, a division of VMware

  3. #3

    Default

    Thank you so much for the quick response.

    So following is a code for my gateway which is called from one java class:
    Code:
    public interface IntegrationGateway {
        Object  execute(Message m);	
    }
    and code for java class:
    Code:
    try {
    	// invoke the gateway
    	response = gateway.execute(message);
         } catch (MessagingException exception) {
    	logger.debug("Messaging Exception..",exception);
         }catch(NullPointerException ne){
    	logger.debug("Yeah I received Null..",ne);
         }catch (Exception e){
    	logger.debug("Exception is...:"+e);
         }
    So I am expecting following exceptions:
    1) SOAP Fault
    2) Any runtime like NullPointer Exception

    Now if I have error channel and my transformer, it goes to a catch block of Messaging Exception. And when I remove them, it goes to catch block of NullPointerException in case of NullPointer exception and to catch block of Exception in case of SOAP Fault exception.

    For the reference following is the method signature of my transformer after error channel:
    Code:
    public void transform(MessagingException exception){
    // Logic to work with exception
    }
    Am I doing something wrong in my code?

  4. #4
    Join Date
    Mar 2010
    Location
    Gtr Philadelphia, PA
    Posts
    2,021

    Default

    I should have explained further; the above discussion was about checked exceptions (exceptions that are not subclasses of RuntimeException).

    The gateway also unwraps most RuntimeExceptions (and subclasses). Any RuntimeExceptions (that are not MessagingException, UndeclaredThrowableException or IllegalStateException who's message is 'Unexpected Exception Thrown') are also unwrapped.

    NullpointerException is a RuntimeException, so it is unwrapped.

    With an error channel; no unwrapping is performed and the full context of the exception is forwarded in the ErrorMessage.

    The main reason for this behavior is to minimize the exposure of Spring Integration to your application. Where possible, you get the native exception thrown by endpoints in the downstream flow (checked or otherwise); you only get MessagingException if something in the framework or configuration failed, and you can catch those in a generic RuntimeException catch block, rather than exposing your application to the messaging infrastructure.
    Gary P. Russell
    Spring Integration Team
    SpringSource, a division of VMware

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •