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

Claudio Mattioni reassigned NIFI-16241:
---------------------------------------

    Assignee: Claudio Mattioni

> PublishAMQP should route FlowFiles with null or blank evaluated Routing Key 
> to failure
> --------------------------------------------------------------------------------------
>
>                 Key: NIFI-16241
>                 URL: https://issues.apache.org/jira/browse/NIFI-16241
>             Project: Apache NiFi
>          Issue Type: Bug
>          Components: Extensions
>    Affects Versions: 2.11.0
>            Reporter: Claudio Mattioni
>            Assignee: Claudio Mattioni
>            Priority: Major
>              Labels: AMQP
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> {{PublishAMQP}} supports Expression Language for the *Routing Key* property. 
> The configured property is validated as non-empty, but the value obtained 
> after evaluating Expression Language against a FlowFile can be null or blank.
> At runtime, {{PublishAMQP.processResource()}} evaluates the Routing Key and 
> only checks whether the resulting value is {{{}null{}}}.
> A blank value therefore reaches {{{}AMQPPublisher.publish(){}}}, where 
> {{validateStringProperty()}} rejects null or blank Routing Keys with an 
> {{{}IllegalArgumentException{}}}.
> This exception is not handled as a FlowFile-specific failure. It propagates 
> to the generic exception handler in {{{}AbstractAMQPProcessor{}}}, which 
> rolls back the ProcessSession, yields the processor, and closes the AMQP 
> client.
> As a result, the affected FlowFile remains in the incoming queue and the same 
> deterministic error is retried indefinitely.
> The same rollback behavior can also occur when evaluation produces 
> {{{}null{}}}, because the current null check throws an 
> {{IllegalArgumentException}} instead of routing the FlowFile to 
> {{{}failure{}}}.
> h2. Steps to Reproduce
>  # Configure a {{PublishAMQP}} processor with a valid RabbitMQ connection and 
> destination.
>  # Configure *Routing Key* using Expression Language, for example 
> {{{}${missing}{}}}, where the referenced FlowFile attribute is not present, 
> or use an expression/attribute that evaluates to a blank value.
>  # Send a FlowFile without the referenced attribute through the processor.
>  # Observe that the FlowFile is not transferred to either {{success}} or 
> {{{}failure{}}}.
>  # Observe an {{IllegalArgumentException}} related to the Routing Key and the 
> FlowFile remaining in the incoming queue.
>  # Allow the processor to run again and observe the same FlowFile being 
> retried indefinitely.
> A test probe reproduced the behavior with:
> {{success = 0}}
> {{failure = 0}}
> {{queued FlowFiles = 1}}
> and an {{IllegalArgumentException}} caused by the invalid Routing Key.
> h2. Expected Behavior
> When the evaluated Routing Key is null or blank, the FlowFile should be 
> routed to the {{failure}} relationship instead of rolling back the 
> ProcessSession.
> This is a deterministic FlowFile-specific configuration/data problem, so 
> recreating the AMQP client and retrying the same FlowFile cannot resolve it.
> h2. Actual Behavior
> The invalid evaluated Routing Key results in an 
> {{{}IllegalArgumentException{}}}.
> The exception reaches the generic error handler in 
> {{{}AbstractAMQPProcessor{}}}, which rolls back the session, yields the 
> processor, and closes the AMQP client.
> The FlowFile therefore remains queued and is retried indefinitely.
> h2. Suggested Fix
> Validate the evaluated Routing Key in {{PublishAMQP.processResource()}} 
> before invoking {{AMQPPublisher.publish()}} and route invalid values directly 
> to {{{}failure{}}}.
> For example:
> {{if (routingKey == null || routingKey.isBlank()) \{
>     getLogger().error("Failed to determine a non-empty Routing Key after 
> evaluating the configured value against FlowFile {}", flowFile);
>     session.transfer(flowFile, REL_FAILURE);
>     return;
> }}}
> This also avoids unnecessarily dropping and recreating the AMQP client for an 
> error that is unrelated to the connection.



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

Reply via email to