Exceptions within a callback: IOException, RuntimeException
More often than not, when an Exception occurs in a Processor, it occurs from within a
callback (I.e., InputStreamCallback
,
OutputStreamCallback
, or StreamCallback
). That is,
during the processing of a FlowFile's content. Callbacks are allowed to throw either
RuntimeException
or IOException
. In the case of
RuntimeException, this Exception will propagate back to the onTrigger
method. In the case of an IOException
, the Exception will be wrapped
within a ProcessException and this ProcessException will then be thrown from the
Framework.
For this reason, it is recommended that Processors that use callbacks do so within a
try/catch
block and catch ProcessException
as well
as any other RuntimeException
that they expect their callback to throw.
It is not recommended that Processors catch the general
Exception
or Throwable
cases, however. This is
discouraged for two reasons.
First, if an unexpected RuntimeException is thrown, it is likely a bug and allowing the framework to rollback the session will ensure no data loss and ensures that DataFlow Managers are able to deal with the data as they see fit by keeping the data queued up in place.
Second, when an IOException is thrown from a callback, there really are two types of
IOExceptions: those thrown from Processor code (for example, the data is not in the expected
format or a network connection fails), and those that are thrown from the Content Repository
(where the FlowFile content is stored). If the latter is the case, the framework will catch
this IOException and wrap it into a FlowFileAccessException
, which
extends RuntimeException
. This is done explicitly so that the Exception
will escape the onTrigger
method and the framework can handle this
condition appropriately. Catching the general Exception prevents this from happening.