When Processors are Triggered
A Processor's onTrigger
method will be called only when it
is scheduled to run and when work exists for the Processor. Work is said to exist for a
Processor if any of the following conditions is met:
A Connection whose destination is the Processor has at least one FlowFile in its queue
The Processors has no incoming Connections
The Processor is annotated with the @TriggerWhenEmpty annotation
Several factors exist that will contribute to when a Processor's
onTrigger
method is invoked. First, the Processor will not be
triggered unless a user has configured the Processor to run. If a Processor is scheduled
to run, the Framework periodically (the period is configured by users in the User
Interface) checks if there is work for the Processor to do, as described above. If so,
the Framework will check downstream destinations of the Processor. If any of the
Processor's outbound Connections is full, by default, the Processor will not be
scheduled to run.
However, the @TriggerWhenAnyDestinationAvailable
annotation may
be added to the Processor's class. In this case, the requirement is changed so that
only one downstream destination must be "available" (a destination is
considered "available" if the Connection's queue is not full), rather
than requiring that all downstream destinations be available.
Also related to Processor scheduling is the @TriggerSerially
annotation. Processors that use this Annotation will never have more than one thread
running the onTrigger
method simultaneously. It is crucial to note,
though, that the thread executing the code may change from invocation to invocation.
Therefore, care must still be taken to ensure that the Processor is thread-safe!