Vishal Biyani
Vishal Biyani

Reputation: 4407

Throwing exception from ServiceActivator vs. Filter behaves differently

In our application we have error handling mechanism, where we throw runtime exceptions on an error. I noticed a strange behavior and I want to understand the mechanism underlying this one

1) Situation 1: Exception thrown from ServiceActivator is converted to MessageHandlingException

When an error occurs in a ServiceActivator, we throw an exception. The message we get on ErrorChannel has PayLoad as org.springframework.integration.MessageHandlingException and actual exception thrown as cause

2) Situation 2: Exception thrown from Filter is not masked with MessageHandlingException

When an error occurs in Filter, and we throw exception, then PayLoad is actual exception, and is not masked with org.springframework.integration.MessageHandlingException

I have a few questions:

Update 1:

Filter extends AbstractFileListFilter which is part of a filter chain- a custom CompositeFileFilter which implements FileListFilter

CompositeFileFilter is being used by a file:inbound-channel-adapter and which passes the output to a Channel declared below:

<int:channel
  id="channelForFilesComingIn"
  datatype="java.io.File"
>
   <int:dispatcher task-executor="dispatchExecutor" />
</int:channel>

Update 2:

Whet we are trying to do is read files from filesystem and process them. In file reading part, using file:inbound-channel-adapter with a CompositeFilter which filters files which are not completely uploaded or don't meet naming standards.

After all filters pass, file is handed over to a ServiceActivator for processing

In any of above (Filter chain or Service) , if there is an error condition, it has to be reported to DB and by email. For achieving this we are throwing ApplicationException which are caught by errorChannel, and passed to specialized channels.

Upvotes: 0

Views: 2126

Answers (1)

Gary Russell
Gary Russell

Reputation: 174729

Just to make it clear, a MessageHandlingException is thrown (wraps user exception) when a Message HANDLER fails - a message handler is something that HANDLES a message.

If an exception is thrown in the MessageSource, there is no message yet so a MessageHandlingException (or any MessagingException) does not apply.

Instead, the poll fails and the exception is thrown back to the poller.

If you want to handle exceptions in a polled endpoint (MessageSource), you need to give the poller an ErrorHandlingTaskExecutor, to which you can provide an ErrorHandler and do what you want with the exception, but since there is no message yet, it is the original exception thrown by the MessageSource.

If you want to send it to the error channel, you'll need to do that in your custom ErrorHandler.

Upvotes: 0

Related Questions