Hello,

Here is the route from the project. It is running with Apache Camel version 
4.14.7.

-----------------------------------------

from("artemis:thisxmljobQueue.withDelay?transacted=true&concurrentConsumers=1&errorHandlerLoggingLevel=DEBUG")
    .unmarshal(jobsXmlDataFormat) 
    .setBody().method(this.jobRequestFactory, "createJobRequestWithXmlFtpJob")
    .loop(simple("${body.getDocument().size}"))
       .description("Loop thru all the specified attachments and add them to 
the job request.")
       .setProperty(ATTACHMENT_FILE_NAME, 
simple(format("${body.getDocument().get(${exchangeProperty.CamelLoopIndex}).getName()}%s",
 getPollEnrichFilenameSuffix())))
       
.pollEnrich().simple("ftp://localhost:34101/jobs?autoCreate=false&binary=true&bridgeErrorHandler=true&delay=15m&delete=true&fileName=${exchangeProperty.atatchmentfilename}&initialDelay=0&maxMessagesPerPoll=1&maximumReconnectAttempts=0&passiveMode=true&password=xxxxx
 ")
          .cacheSize(pollEnrichCacheSize)
          .timeout(pollEnrichTimeout)
          .aggregateOnException(false)
          .aggregationStrategy(this.jobRequestAggregationStrategy)
       .end()
    .end()
    .toF(getSoapJobToCxfUri(), getSoapJobUrl(), "sendJob", 
getSoapJobToCxfUriSuffix())
    .convertBodyTo(com.acme.JobResponse.class)
    .log(INFO, LOG, format("${header.%s} - Job submitted - Job ID: 
${body.jobId}",XMLFTPJOB_CAMEL_HEADER_JOB_FILENAME));

On 2026/07/21 14:01:54 Marcus Ionker wrote:
> Hello Apache Camel Developers,
> 
> I suspect a bug GenericFilePollDynamicAware.resolveStaticUri. I did not find 
> an existing Jira ticket in ASF pertaining to this issue.I prepared the 
> following ticket, which contains a detailed description of the problem. I 
> hope I have not overlooked anything. My current workaround is to set 
> allowOptimisedComponents to false. Maybe the problem is related to the fact 
> that although the file endpoints (incl. ftp, fps and sftp) support 
> expressions in the URI, they are resolved with an empty dummy exchange, 
> rather than an actual exchange.
> 
> Best Regads,
> Marcus Ionker
> 
> ----------------------------
> 
> Bug:
> 
> GenericFilePollDynamicAware.resolveStaticUri incorrectly returns static URI 
> for dynamic fileNameexpressions, breaking PollEnricher optimization
> 
> Description:
> 
> There is an optimization regression in 
> org.apache.camel.component.file.GenericFilePollDynamicAware when used 
> alongside pollEnrich.
> 
> When a pollEnrich endpoint contains a dynamic simple expression targeting a 
> parameter like fileName (e.g., in a File or FTP/SFTP endpoint), 
> GenericFilePollDynamicAware.resolveStaticUri fails to return null. Other 
> implementations of PollDynamicAwareSupport correctly yield null when a 
> component configuration is dynamic. Because it incorrectly evaluates to a 
> non-null static URI base, PollEnricher.java falls into an invalid 
> optimization block.
> 
> Root Cause Analysis:
> 
> GenericFilePollDynamicAware.resolveStaticUri is returning the resolved 
> dynamic URI instead of null
> 
> if (fileName) {
>    Map<String, Object> params = entry.getProperties();
>    Map<String, Object> originalParams = 
> URISupport.parseQuery(URISupport.extractQuery(entry.getOriginalUri()));
>    compute(originalParams, PROP_FILE_NAME, params);
>    return asEndpointUri(exchange, uri, params);
> } else {
>    return uri;
> }
> 
> Inside org.apache.camel.processor.PollEnricher.process(), the framework 
> attempts to evaluate and optimize the dynamic endpoint.
> 
> try {
>    recipient = expression.evaluate(exchange, Object.class);
>    if (dynamicAware != null) {
>       // if its the same scheme as the pre-resolved dynamic aware then we can 
> optimise to use it
>       String originalUri = uri;
>       String uri = resolveUri(exchange, recipient);
>       String scheme = resolveScheme(exchange, uri);
>       if (dynamicAware.getScheme().equals(scheme)) {
>          PollDynamicAware.DynamicAwareEntry entry = 
> dynamicAware.prepare(exchange, uri, originalUri);
>          if (entry != null) {
>             staticUri = dynamicAware.resolveStaticUri(exchange, entry);
>             if (staticUri != null) {
>                if (LOG.isDebugEnabled()) {
>                   LOG.debug("Optimising poll via PollDynamicAware component: 
> {} to use static uri: {}", scheme,
>                      URISupport.sanitizeUri(staticUri));
>                }
>             }
>          }
>       }
>    }
> }...
> 
> 
> The Breakdown:
> 
> - expression.evaluate(...) correctly resolves the dynamic endpoint.
> 
> - However, because GenericFilePollDynamicAware.resolveStaticUri provides a 
> fallback staticUri string rather than null, PollEnricher assumes it can 
> safety optimize the consumer.
> 
> - Instead of using the fully evaluated runtime endpoint string (recipient), 
> the route erroneously falls back to using the unparsed simple expression 
> itself as the literal target.
> 
> - The FTP/File consumer subsequently tries to poll using the literal 
> expression text, resulting in a lookup failure because the string syntax does 
> not match an actual file name on the remote target file system.
> 
> Current Workaround: 
> 
> Configuring the EIP via 
> .pollEnrich().simple("...").allowOptimisedComponents(false)bypasses 
> PollDynamicAware entirely, forcing Camel to correctly interpret the parsed 
> expression string on every exchange.
> 
> Expected Fix:
> 
> GenericFilePollDynamicAware.resolveStaticUri must return null if the URI is 
> dynamic to disable optimization, mirroring standard PollDynamicAwareSupport 
> behavior.

Reply via email to