Claudio Mattioni created NIFI-16241:
---------------------------------------

             Summary: 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


{{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