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

Daniel Stieglitz updated NIFI-15739:
------------------------------------
    Status: Reopened  (was: Reopened)

> 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
>            Assignee: Daniel Stieglitz
>            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)

Reply via email to