You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "Xinyu Wang (Jira)" <ji...@apache.org> on 2026/03/25 00:38:00 UTC

[jira] [Reopened] (NIFI-15739) ExecuteGroovyScript: FlowFile not transferred to failure when dynamic property contains Expression Language syntax error

     [ https://issues.apache.org/jira/browse/NIFI-15739?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Xinyu Wang reopened NIFI-15739:
-------------------------------

> ExecuteGroovyScript: FlowFile not transferred to failure when dynamic property contains Expression Language syntax error
> ------------------------------------------------------------------------------------------------------------------------
>
>                 Key: NIFI-15739
>                 URL: https://issues.apache.org/jira/browse/NIFI-15739
>             Project: Apache NiFi
>          Issue Type: Bug
>          Components: Extensions
>    Affects Versions: 2.5.0
>            Reporter: Xinyu Wang
>            Priority: Major
>         Attachments: image-2026-03-25-08-33-20-522.png
>
>
> When an ExecuteGroovyScript processor has a dynamic property whose value contains an Expression Language syntax error, and the Failure Strategy is set to "transfer to failure", the FlowFile in the upstream queue is not transferred to the failure relationship. Instead, the FlowFile remains stuck in the incoming queue, and the processor enters an infinite error loop — logging the same error on every scheduling trigger.
> *Root Cause*
>   In ExecuteGroovyScript.onTrigger(), the execution order is:
>  # Evaluate dynamic properties — iterates context.getProperties() and calls evaluateAttributeExpressions() on each dynamic property value
>  # Execute script — where session.get() is typically called by user code to dequeue a FlowFile
>   The GroovyProcessSessionWrap maintains a toFail list that is only populated when session.get() is called.
>   When a dynamic property has an EL syntax error:
>  * The exception is thrown at step 1
>  * script.run() (step 2) is never reached
>  * session.get() is never called
>  * toFail list remains empty
>  * The catch block calls session.revertReceivedTo(REL_FAILURE, t), which iterates over the empty toFail list — effectively a no-op
>  * The FlowFile was never dequeued, so it stays in the incoming connection
> *Steps to Reproduce*
>  # Create a flow: GenerateFlowFile → ExecuteGroovyScript
>  # In ExecuteGroovyScript, set Failure Strategy to "Transfer to failure"
>  # Add a dynamic property (e.g. myProp) with an invalid EL expression as value, e.g. *_${myparam:isempty()}_*
>  # Add a simple script body
>  # Connect the failure relationship to a downstream processor (e.g. LogAttribute)
>  # Start the flow
>   {*}Expected{*}: FlowFile is transferred to the failure relationship with ERROR_MESSAGE and ERROR_STACKTRACE attributes.
>   {*}Actual{*}: FlowFile remains stuck in the incoming queue. The processor logs the expression language error repeatedly on every trigger. Nothing is ever routed to failure.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)