[
https://issues.apache.org/jira/browse/NIFI-15840?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Daniel Stieglitz updated NIFI-15840:
------------------------------------
Status: Patch Available (was: In Progress)
> ExecuteGroovyScript fails with "Failure Strategy = transfer to failure" in
> NiFi 2.9.0
> -------------------------------------------------------------------------------------
>
> Key: NIFI-15840
> URL: https://issues.apache.org/jira/browse/NIFI-15840
> Project: Apache NiFi
> Issue Type: Bug
> Components: Core Framework
> Affects Versions: 2.9.0
> Reporter: Sven Van Kerrebroeck
> Assignee: Daniel Stieglitz
> Priority: Major
> Attachments: GroovyScript_reproduce_flow.json,
> image-2026-04-15-16-09-21-039.png
>
> Time Spent: 10m
> Remaining Estimate: 0h
>
> After upgrading from Apache NiFi 2.8.0 to 2.9.0, we observed a regression in
> the *ExecuteGroovyScript* processor when using {{Failure Strategy = transfer
> to failure}}
> In this configuration, the processor fails with FlowFileHandlingException
> errors instead of properly routing FlowFiles to the failure relationship.
> The issue occurs even with trivial scripts that simply transfer a FlowFile to
> success.
> When switching the same processor to {{{}Failure Strategy = rollback{}}}, the
> processor behaves normally and processes FlowFiles without errors.
> In v2.8.0 this worked correctly.
> ----
> When "{{{}Failure Strategy = transfer to failure"{}}} is configured, the
> processor throws errors such as:
>
> {code:java}
> org.apache.nifi.processor.exception.FlowFileHandlingException:
> StandardFlowFileRecord[uuid=4128e0b1-0f4c-4da3-82f4-8edf81334c3c,claim=,offset=0,name=4128e0b1-0f4c-4da3-82f4-8edf81334c3c,size=0]
> transfer relationship not specified. This FlowFile was not created in this
> session and was not transferred to any Relationship via
> ProcessSession.transfer():
> org.apache.nifi.processor.exception.FlowFileHandlingException:
> StandardFlowFileRecord[uuid=4128e0b1-0f4c-4da3-82f4-8edf81334c3c,claim=,offset=0,name=4128e0b1-0f4c-4da3-82f4-8edf81334c3c,size=0]
> transfer relationship not specified. This FlowFile was not created in this
> session and was not transferred to any Relationship via
> ProcessSession.transfer()
> Processing halted: yielding [1 sec]:
> org.apache.nifi.processor.exception.FlowFileHandlingException:
> StandardFlowFileRecord[uuid=4128e0b1-0f4c-4da3-82f4-8edf81334c3c,claim=,offset=0,name=4128e0b1-0f4c-4da3-82f4-8edf81334c3c,size=0]
> is not known in this session (StandardProcessSession[id=48607982])
> {code}
>
> This happens even when:
> * the script explicitly transfers the FlowFile to REL_SUCCESS
> * no exception is thrown by the script itself
> *Steps to Reproduce*
> * In NiFi 2.9.0, create a new ExecuteGroovyScript processor
> * Set: Failure Strategy = transfer to failure
> * Use the following minimal script:
> {code:java}
> def ff = session.get()
> if (!ff) return
> session.transfer(ff, REL_SUCCESS) {code}
> * connect an incoming flowfile
> * add success and failure output queues
> * start the processors
> _(I added the export of this small example/test flow in attachment)_
> !image-2026-04-15-16-09-21-039.png!
>
> ----
> *Workaround* (for those who need it):
> * Depending on situation you can use ExecuteScript processor instead of
> ExecuteGroovyScript (but not always possible if you use CTL.* property's for
> example)
> * other option: add try-catch error handling around the whole script (right
> after the session.get) and keep "Failure Strategy = rollback". Then make sure
> in the catch that you transfer to failure output when needed (and add usefull
> messages/attributes)
> For example:
>
> {code:java}
> def flowFile = session.get()
> if (!flowFile) return
> try {
> // =========================
> // YOUR LOGIC HERE
> // =========================
> // Always end with exactly ONE action:
> session.transfer(flowFile, REL_SUCCESS)
> } catch (Exception e) {
> log.error("Processor failed for FlowFile ${flowFile?.uuid}:
> ${e.message}", e)
> try {
> flowFile = session.putAttribute(flowFile, "error.message", e.message
> ?: e.toString())
> flowFile = session.putAttribute(flowFile, "error.class",
> e.getClass().getName())
> } catch (ignored) {
> log.error("Failed to set error attributes", ignored)
> }
> session.transfer(flowFile, REL_FAILURE)
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)