Skip to content

CAMEL-25728: camel-file - keep a done file with a fixed name for the files a poll left - #28035

Merged
davsclaus merged 2 commits into
apache:mainfrom
allthingssecurity:camel-file-done-file-kept-while-files-left
Oct 18, 2026
Merged

davsclaus merged 2 commits into
apache:mainfrom
allthingssecurity:camel-file-done-file-kept-while-files-left

Conversation

@allthingssecurity

@allthingssecurity allthingssecurity commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Description

CAMEL-25728

With a done file of a fixed name (doneFileName=ready) the file consumer only picks up the files of a directory while the done file exists, and GenericFileOnCompletion.handleDoneFile deletes it when the last file of the batch (CamelBatchComplete, CAMEL-5883) is committed. The batch is the poll, not the directory. Files the poll did not take then stay without their done file, and are left until a new done file is written, without a log:

  • with maxMessagesPerPoll, the files beyond the limit;
  • a file whose processing could not start (read lock not acquired, begin or download failed).

Change: the poll keeps the done file of every file it did not take (beyond the limit, or not started; for a file that was not started, the file as polled, not the one a preMove bound to the exchange), in GenericFileKeptDoneFiles (package-private), and the last file of the batch does not delete a kept done file. While it is kept, the polls consume every file of the directory, as they do on main whenever the done file is there, including a file written meanwhile (for example by a Camel producer with doneFileName, which rewrites the done file after each file). The done file is then deleted after the last file of a poll that leaves nothing, as before, or by the next poll if a complete listing finds none of its files. A file that was taken and failed is handled as on main: the done file is deleted after the last file of the poll unless that file failed, and a failed file is tried again while the done file is there, so a file that always fails cannot hold the done file. With exactly maxMessagesPerPoll files nothing is left and nothing changes. Dynamic done files (${file:name}.done) and noop=true behave as before. pollEnrich and ConsumerTemplate.receive (one file per call) keep the done file until the last file is received; on main the first received file deleted it. The FTP, SFTP, SMB and Azure Files consumers share these classes (GenericFileConsumer, GenericFileOnCompletion).

Cost: with eagerMaxMessagesPerPoll=true (the default), such a consumer lists one file past maxMessagesPerPoll to know that the poll leaves files, and cuts the list to the same files the eager limit takes (no Exchange for the extra one). When the listing stops there, the done files of the files listed are kept (with recursive=true the files of another directory may not have been listed), and a kept done file is only deleted as gone after a complete listing.

Limits (in memory, cleared on stop): after a restart a kept done file is treated as any done file found. A file that can never be started (for example behind a stale lock file) keeps the done file until it is gone or can be started.

Tests:

  • New FileConsumerDoneFileNameFilesLeftTest (14 tests). On main six fail: maxMessagesPerPoll=2 with three files (mock://limit ... Expected: <3> but was: <2>); the same with eagerMaxMessagesPerPoll=false (mock://noteager ... <3> but was: <2>); the read lock of b not acquired the first time (mock://notstarted ... <3> but was: <2>); maxMessagesPerPoll=1 with x written while the first file is routed (mock://gate ... Expected: <4> but was: <1>); the same with x written by a Camel producer with doneFileName=ready, which rewrites the done file (mock://producer ... <4> but was: <1>); ConsumerTemplate.receiveBody three times on a, b, c (expected: <[A, B, C]> but was: <[null, C]>).
  • testDownloadFailingAfterPreMoveKeepsTheDoneFileOfTheDirectory (a download failing after preMove) pins that the done file kept is the one of the polled directory: with the pre-moved file it deleted work/ready.
  • The others pass on main as well and pin what must not change: exactly maxMessagesPerPoll files (done file deleted; a file written meanwhile not consumed); a file failing once waits for the next done file; a last file failing once keeps the done file and is retried with the file written meanwhile; a file that always fails does not block the next batch (d and ready again), also with maxMessagesPerPoll (where it is tried again with the file left, as on main); ${file:name}.done unchanged. Tests that expect a file not to be consumed check it once the done file is gone (synchronous routes), so they do not depend on timing.
  • With the change: camel-file 24, the file tests of camel-core (org.apache.camel.component.file.**) 474 run, 12 skipped, 0 failures; camel-ftp with embedded FTP and SFTP servers: 17 done-file, maxMessagesPerPoll, consumer-template and pollEnrich ITs (24 tests, including SftpSimpleConsumeRecursiveIT), RemoteFileIgnoreDoPollErrorTest and SftpPreSortTest (14 tests), 0 failures. Formatter and import-sort checks pass.

What is not changed: with asynchronous routing a poll can still run while the last file is completing (the same window as on main).

What was not run: the full root build; the whole camel-ftp suite; the camel-smb and camel-azure-files tests.

Target

  • I checked that the commit is targeting the correct branch (Camel 4 uses the main branch)

Tracking

  • If this is a large change, bug fix, or code improvement, I checked there is a JIRA issue filed for the change (usually before you start working on it): CAMEL-25728.

Apache Camel coding standards and style

  • I checked that each commit in the pull request has a meaningful subject line and body.
  • I have run mvn clean install -DskipTests locally from root folder and I have committed all auto-generated changes.
    (I built and tested camel-file, camel-core, camel-ftp-common and camel-ftp, including the formatter and import-sort plugins. I did not run the full root build.)

AI-assisted contributions

  • If this PR includes AI-generated code, commits have proper co-authorship attribution (e.g., Co-authored-by trailers) and the PR description identifies the AI tool used.
    This PR was prepared with Claude Code (Claude Opus 5.5). The commit carries a Co-Authored-By trailer.

Claude Code on behalf of allthingssecurity

🤖 Generated with Claude Code

…files a poll left

With doneFileName=ready the consumer only picks up the files of a directory
while the done file exists, and the last file of the batch (CamelBatchComplete)
deletes it. The batch is the poll: with maxMessagesPerPoll the files beyond the
limit, and a file whose processing could not start (read lock not acquired),
stay in the directory, but the done file is gone, so they are left until a new
done file is written.

The poll now remembers the files it left (beyond the limit, or not started),
per done file, and the last file of the batch does not delete the done file
while there are any. The next poll only consumes these files, so a file written
to the directory meanwhile still waits for a new done file, and the done file
is deleted after its last file as before (or by the next poll if these files
are gone). A file that was processed and failed is not left: it is handled as
before. To know the files beyond the limit, such a consumer checks every file
of the directory also with the eager limit, and then cuts the list to the same
files the eager limit takes. The state is in memory and cleared on stop.
Dynamic done files, noop and recursive=true are unchanged. The FTP, SFTP, SMB
and Azure Files consumers share this code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

🌟 Thank you for your contribution to the Apache Camel project! 🌟
🤖 CI automation will test this PR automatically.

🐫 Apache Camel Committers, please review the following items:

  • First-time contributors require MANUAL approval for the GitHub Actions to run
  • You can use the command /component-test (camel-)component-name1 (camel-)component-name2.. to request a test from the test bot although they are normally detected and executed by CI.
  • You can label PRs using skip-tests and test-dependents to fine-tune the checks executed by this PR.
  • Build and test logs are available in the summary page. Only Apache Camel committers have access to the summary.

⚠️ Be careful when sharing logs. Review their contents before sharing them publicly.

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @allthingssecurity.

The problem is real: with a fixed done file, the last file of the poll deletes it, so the files beyond maxMessagesPerPoll, or a file whose read lock was not acquired, sit there until the next done file. Keeping the done file while a poll left files is a reasonable fix. I traced it through the eager and non-eager limits, the not-started path, the shutdown drain and the browse consumer, and the bookkeeping holds up. ftp/sftp/smb/azure-files go through the same canPollMoreFiles, isMatched and GenericFileOnCompletion, so they are consistent too.

My main concern is the gate that only admits the left files while the done file is kept. The PR lists "a producer must not rewrite a done file that is still there" as a limit, but Camel's own file producer does exactly that: to("file:bar?doneFileName=done") deletes and rewrites done after every file it writes (GenericFileProducer.writeDoneFile). With that producer feeding from("file:bar?doneFileName=done&maxMessagesPerPoll=N"), the files written while the consumer drains are not admitted, and the done file the producer just rewrote to announce them is deleted after the last left file. They are then stranded until the producer writes again, while on main the next poll picks them up. So for the most common Camel-to-Camel setup this widens the problem instead of closing it. Could the gate be lifted when the done file was rewritten (its timestamp changed; FTP listings may only have minute resolution, though), or dropped so the done file is simply kept while files are left? Main already consumes files written after the done file as long as it is there. A test with a Camel producer writing the done file during the drain would pin this.

Second, GenericFilePollingConsumer forces maxMessagesPerPoll=1, so pollEnrich and ConsumerTemplate.receive with a fixed done file now take this path on every receive and keep the done file across receives (on main the first received file deletes it). That is probably an improvement, but it is a behaviour change without a test, and the upgrade-guide entry should mention it.

A small mismatch with the description: when files are left and the last file of the poll fails, it is not retried under the same done file, because the next poll admits only the left files (main does retry it; testFileThatAlwaysFailsWithFilesLeftDoesNotHoldDoneFile pins this). Fine with me, but the description says otherwise.

Claude Code on behalf of Claus Ibsen

@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • catalog/camel-catalog
  • components/camel-file
  • core/camel-core
  • docs

ℹ️ Dependent modules were not tested because the total number of affected modules exceeded the threshold (50). Use the test-dependents label to force testing all dependents.

🔁 2 tests passed only after a retry on JDK 25 (2 retried attempts)

Recovered flaky tests on JDK 25 (2)
Module Test Failed attempts First failure
core/camel-core StopTimeoutRouteTest.testStopTimeout 1 mock://foo Body of message: 0. Expected: <Hello Foo> but was: <Hello World>
core/camel-core TotalRequestsThrottlerRateDecreaseTest.testDecreaseWhileExchangesWaitForPermits 1 Condition with Lambda expression in org.apache.camel.processor.throttle.requests.TotalRequestsThrottlerRateDecreaseTest was not fulfilled within 5 seconds.

ℹ️ These tests did not fail the build. Surefire retried them and they passed.
Retries are enabled project-wide by surefire.rerunFailingTestsCount in parent/pom.xml.


🔬 Scalpel shadow comparison — Scalpel: 489 of 706 tested, 25 compile-only — current: 493 all tested

Maveniverse Scalpel detected 489 affected modules (current approach: 493).

Skip-tests mode would test 489 modules (4 direct + 487 downstream), skip tests for 25 (generated code, meta-modules)

Modules only in current approach (4)
  • camel-debug
  • camel-google-common
  • camel-jbang-console
  • camel-test-infra-core
Modules Scalpel would test (489)
  • archetypes ← downstream of org.apache.camel:camel-test-junit6
  • camel-a2a ← downstream of org.apache.camel:camel-test-junit6
  • camel-activemq ← downstream of org.apache.camel:camel-test-infra-artemis
  • camel-activemq6 ← downstream of org.apache.camel:camel-test-infra-artemis
  • camel-ai-observability ← downstream of org.apache.camel:camel-test-junit6
  • camel-ai-observability-api ← downstream of org.apache.camel:camel-test-junit6
  • camel-ai-resource ← downstream of org.apache.camel:camel-test-junit6
  • camel-ai-tool ← downstream of org.apache.camel:camel-test-junit6
  • camel-alibaba-eventbridge ← downstream of org.apache.camel:camel-test-junit6
  • camel-alibaba-fc ← downstream of org.apache.camel:camel-test-junit6
  • camel-alibaba-kms ← downstream of org.apache.camel:camel-test-junit6
  • camel-alibaba-mns ← downstream of org.apache.camel:camel-test-junit6
  • camel-alibaba-oss ← downstream of org.apache.camel:camel-test-junit6
  • camel-alibaba-ots ← downstream of org.apache.camel:camel-test-junit6
  • camel-alibaba-sls ← downstream of org.apache.camel:camel-test-junit6
  • camel-alibaba-sms ← downstream of org.apache.camel:camel-test-junit6
  • camel-amqp ← downstream of org.apache.camel:camel-test-junit6
  • camel-api-component-maven-plugin ← downstream of org.apache.camel:camel-test-junit6
  • camel-arangodb ← downstream of org.apache.camel:camel-test-junit6
  • camel-archetype-api-component ← downstream of org.apache.camel:camel-test-junit6
  • camel-archetype-component ← downstream of org.apache.camel:camel-test-junit6
  • camel-archetype-dataformat ← downstream of org.apache.camel:camel-test-junit6
  • camel-archetype-java ← downstream of org.apache.camel:camel-test-junit6
  • camel-archetype-main ← downstream of org.apache.camel:camel-test-junit6
  • camel-as2 ← downstream of org.apache.camel:camel-test-junit6
  • camel-as2-api ← downstream of org.apache.camel:camel-test-junit6
  • camel-asn1 ← downstream of org.apache.camel:camel-test-junit6
  • camel-asterisk ← downstream of org.apache.camel:camel-test-junit6
  • camel-atmosphere-websocket ← downstream of org.apache.camel:camel-test-junit6
  • camel-atom ← downstream of org.apache.camel:camel-test-junit6
  • camel-attachments ← downstream of org.apache.camel:camel-test-junit6
  • camel-avro ← downstream of org.apache.camel:camel-test-junit6
  • camel-avro-rpc ← downstream of org.apache.camel:camel-test-junit6
  • camel-aws-bedrock ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws-cloudtrail ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws-config ← downstream of org.apache.camel:camel-test-junit6
  • camel-aws-parameter-store ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws-secrets-manager ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws-security-hub ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-athena ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-comprehend ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-cw ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-ddb ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-ec2 ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-ecs ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-eks ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-eventbridge ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-iam ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-kinesis ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-kms ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-lambda ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-mq ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-msk ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-polly ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-redshift ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-rekognition ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-s3 ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-s3-vectors ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-ses ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-sns ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-sqs ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-step-functions ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-sts ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-textract ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-timestream ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-aws2-transcribe ← downstream of org.apache.camel:camel-test-junit6
  • camel-aws2-translate ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-azure-cosmosdb ← downstream of org.apache.camel:camel-test-junit6
  • camel-azure-eventgrid ← downstream of org.apache.camel:camel-test-junit6
  • camel-azure-eventhubs ← downstream of org.apache.camel:camel-test-junit6
  • camel-azure-files ← downstream of org.apache.camel:camel-test-junit6
  • camel-azure-functions ← downstream of org.apache.camel:camel-test-junit6
  • camel-azure-key-vault ← downstream of org.apache.camel:camel-test-junit6
  • camel-azure-schema-registry ← downstream of org.apache.camel:camel-test-junit6
  • camel-azure-servicebus ← downstream of org.apache.camel:camel-test-junit6
  • camel-azure-storage-blob ← downstream of org.apache.camel:camel-test-junit6
  • camel-azure-storage-datalake ← downstream of org.apache.camel:camel-test-junit6
  • camel-azure-storage-queue ← downstream of org.apache.camel:camel-test-junit6
  • camel-barcode ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-base64 ← downstream of org.apache.camel:camel-test-junit6
  • camel-bean-validator ← downstream of org.apache.camel:camel-test-junit6
  • camel-beanio ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-bindy ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-bonita ← downstream of org.apache.camel:camel-test-junit6
  • camel-box ← downstream of org.apache.camel:camel-test-junit6
  • camel-braintree ← downstream of org.apache.camel:camel-test-junit6
  • camel-caffeine ← downstream of org.apache.camel:camel-test-junit6
  • camel-camunda ← downstream of org.apache.camel:camel-test-junit6
  • camel-cassandraql ← downstream of org.apache.camel:camel-test-junit6
  • camel-cbor ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-chatscript ← downstream of org.apache.camel:camel-test-junit6
  • camel-chunk ← downstream of org.apache.camel:camel-test-junit6
  • camel-cli-connector ← downstream of org.apache.camel:camel-test-junit6
  • camel-cli-debug ← downstream of org.apache.camel:camel-cli-connector
  • camel-clickhouse ← downstream of org.apache.camel:camel-test-junit6
  • camel-clickup ← downstream of org.apache.camel:camel-test-junit6
  • camel-cloudevents ← downstream of org.apache.camel:camel-test-junit6
  • camel-cm-sms ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-coap ← downstream of org.apache.camel:camel-test-junit6
  • camel-cometd ← downstream of org.apache.camel:camel-test-junit6
  • camel-console ← downstream of org.apache.camel:camel-core
  • camel-consul ← downstream of org.apache.camel:camel-file
  • camel-core ← core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerDoneFileNameFilesLeftTest.java
  • camel-core-all ← downstream of org.apache.camel:camel-main
  • camel-couchbase ← downstream of org.apache.camel:camel-test-junit6
  • camel-couchdb ← downstream of org.apache.camel:camel-test-junit6
  • camel-cron ← downstream of org.apache.camel:camel-test-junit6
  • camel-crypto ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-crypto-pgp ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-csv ← downstream of org.apache.camel:camel-main
  • camel-cxf-common ← downstream of org.apache.camel:camel-test-junit6
  • camel-cxf-rest ← downstream of org.apache.camel:camel-test-junit6
  • camel-cxf-soap ← downstream of org.apache.camel:camel-test-junit6
  • camel-cxf-spring-common ← downstream of org.apache.camel:camel-spring-xml
  • camel-cxf-spring-rest ← downstream of org.apache.camel:camel-http
  • camel-cxf-spring-soap ← downstream of org.apache.camel:camel-http
  • camel-cxf-spring-transport ← downstream of org.apache.camel:camel-test-junit6
  • camel-cxf-transport ← downstream of org.apache.camel:camel-test-junit6
  • camel-cyberark-vault ← downstream of org.apache.camel:camel-test-junit6
  • camel-dapr ← downstream of org.apache.camel:camel-test-junit6
  • camel-datasonnet ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-debezium-common ← downstream of org.apache.camel:camel-test-junit6
  • camel-debezium-db2 ← downstream of org.apache.camel:camel-test-junit6
  • camel-debezium-maven-plugin ← downstream of org.apache.camel:camel-test-junit6
  • camel-debezium-mongodb ← downstream of org.apache.camel:camel-test-junit6
  • camel-debezium-mysql ← downstream of org.apache.camel:camel-test-junit6
  • camel-debezium-oracle ← downstream of org.apache.camel:camel-test-junit6
  • camel-debezium-postgres ← downstream of org.apache.camel:camel-test-junit6
  • camel-debezium-sqlserver ← downstream of org.apache.camel:camel-test-junit6
  • camel-dfdl ← downstream of org.apache.camel:camel-test-junit6
  • camel-dhis2 ← downstream of org.apache.camel:camel-test-junit6
  • camel-dhis2-api ← downstream of org.apache.camel:camel-test-junit6
  • camel-dhis2-parent ← downstream of org.apache.camel:camel-test-junit6
  • camel-diagram ← downstream of org.apache.camel:camel-test-junit6
  • camel-disruptor ← downstream of org.apache.camel:camel-test-junit6
  • camel-djl ← downstream of org.apache.camel:camel-test-junit6
  • camel-dns ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-docker ← downstream of org.apache.camel:camel-test-junit6
  • camel-docling ← downstream of org.apache.camel:camel-test-junit6
  • camel-drill ← downstream of org.apache.camel:camel-test-junit6
  • camel-dropbox ← downstream of org.apache.camel:camel-test-junit6
  • camel-dsl-modeline ← downstream of org.apache.camel:camel-test-junit6
  • camel-duckdb ← downstream of org.apache.camel:camel-test-junit6
  • camel-dynamic-router ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-ehcache ← downstream of org.apache.camel:camel-test-junit6
  • camel-elasticsearch ← downstream of org.apache.camel:camel-test-junit6
  • camel-elasticsearch-rest-client ← downstream of org.apache.camel:camel-test-junit6
  • camel-event ← downstream of org.apache.camel:camel-test-junit6
  • camel-exec ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-fastjson ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-fhir ← downstream of org.apache.camel:camel-test-junit6
  • camel-file ← components/camel-file/src/main/docs/file-component.adoc, components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java, components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileKeptDoneFiles.java, components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileOnCompletion.java
  • camel-file-watch ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-flatpack ← downstream of org.apache.camel:camel-file
  • camel-flink ← downstream of org.apache.camel:camel-test-junit6
  • camel-flowable ← downstream of org.apache.camel:camel-test-junit6
  • camel-fop ← downstream of org.apache.camel:camel-test-junit6
  • camel-fory ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-freemarker ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-ftp ← downstream of org.apache.camel:camel-test-junit6
  • camel-ftp-common ← downstream of org.apache.camel:camel-file
  • camel-geocoder ← downstream of org.apache.camel:camel-test-junit6
  • camel-git ← downstream of org.apache.camel:camel-test-junit6
  • camel-github2 ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-bigquery ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-calendar ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-drive ← downstream of org.apache.camel:camel-file
  • camel-google-firestore ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-functions ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-mail ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-pubsub ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-secret-manager ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-sheets ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-speech-to-text ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-storage ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-text-to-speech ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-vertexai ← downstream of org.apache.camel:camel-test-junit6
  • camel-google-vision ← downstream of org.apache.camel:camel-test-junit6
  • camel-graphql ← downstream of org.apache.camel:camel-test-junit6
  • camel-grok ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-groovy ← downstream of org.apache.camel:camel-main
  • camel-grpc ← downstream of org.apache.camel:camel-test-junit6
  • camel-gson ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-hashicorp-vault ← downstream of org.apache.camel:camel-test-junit6
  • camel-hazelcast ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-hivemq ← downstream of org.apache.camel:camel-test-junit6
  • camel-hl7 ← downstream of org.apache.camel:camel-test-junit6
  • camel-http ← downstream of org.apache.camel:camel-file
  • camel-http-base ← downstream of org.apache.camel:camel-test-junit6
  • camel-http-common ← downstream of org.apache.camel:camel-test-junit6
  • camel-huaweicloud-dms ← downstream of org.apache.camel:camel-test-junit6
  • camel-huaweicloud-frs ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-huaweicloud-functiongraph ← downstream of org.apache.camel:camel-test-junit6
  • camel-huaweicloud-iam ← downstream of org.apache.camel:camel-test-junit6
  • camel-huaweicloud-imagerecognition ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-huaweicloud-obs ← downstream of org.apache.camel:camel-test-junit6
  • camel-huaweicloud-smn ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-huggingface ← downstream of org.apache.camel:camel-test-junit6
  • camel-ibm-cos ← downstream of org.apache.camel:camel-test-junit6
  • camel-ibm-secrets-manager ← downstream of org.apache.camel:camel-test-junit6
  • camel-ibm-watson-discovery ← downstream of org.apache.camel:camel-test-junit6
  • camel-ibm-watson-language ← downstream of org.apache.camel:camel-test-junit6
  • camel-ibm-watson-speech-to-text ← downstream of org.apache.camel:camel-test-junit6
  • camel-ibm-watson-text-to-speech ← downstream of org.apache.camel:camel-test-junit6
  • camel-ibm-watsonx-ai ← downstream of org.apache.camel:camel-test-junit6
  • camel-ibm-watsonx-data ← downstream of org.apache.camel:camel-test-junit6
  • camel-ical ← downstream of org.apache.camel:camel-test-junit6
  • camel-iggy ← downstream of org.apache.camel:camel-test-junit6
  • camel-ignite ← downstream of org.apache.camel:camel-test-junit6
  • camel-infinispan ← downstream of org.apache.camel:camel-test-junit6
  • camel-infinispan-common ← downstream of org.apache.camel:camel-test-junit6
  • camel-infinispan-embedded ← downstream of org.apache.camel:camel-test-junit6
  • camel-influxdb ← downstream of org.apache.camel:camel-test-junit6
  • camel-influxdb2 ← downstream of org.apache.camel:camel-test-junit6
  • camel-iso8583 ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-jackson ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-jackson-avro ← downstream of org.apache.camel:camel-test-junit6
  • camel-jackson-protobuf ← downstream of org.apache.camel:camel-test-junit6
  • camel-jackson3 ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-jackson3-avro ← downstream of org.apache.camel:camel-test-junit6
  • camel-jackson3-protobuf ← downstream of org.apache.camel:camel-test-junit6
  • camel-jackson3xml ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-jacksonxml ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-jactl ← downstream of org.apache.camel:camel-test-junit6
  • camel-jandex ← downstream of org.apache.camel:camel-test-junit6
  • camel-jasypt ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-java-joor-dsl ← downstream of org.apache.camel:camel-test-junit6
  • camel-javascript ← downstream of org.apache.camel:camel-test-junit6
  • camel-jaxb ← downstream of org.apache.camel:camel-test-junit6
  • camel-jbang-mcp ← downstream of org.apache.camel:camel-catalog
  • camel-jbang-plugin-mcp ← downstream of org.apache.camel:camel-jbang-core
  • camel-jbang-plugin-tui ← downstream of org.apache.camel:camel-catalog
  • camel-jbang-plugin-validate ← downstream of org.apache.camel:camel-yaml-dsl-validator
  • camel-jcache ← downstream of org.apache.camel:camel-test-junit6
  • camel-jcr ← downstream of org.apache.camel:camel-test-junit6
  • camel-jdbc ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-jetty ← downstream of org.apache.camel:camel-http
  • camel-jetty-common ← downstream of org.apache.camel:camel-spring-xml
  • camel-jfr ← downstream of org.apache.camel:camel-test-junit6
  • camel-jgroups ← downstream of org.apache.camel:camel-test-junit6
  • camel-jgroups-raft ← downstream of org.apache.camel:camel-test-junit6
  • camel-jira ← downstream of org.apache.camel:camel-file
  • camel-jms ← downstream of org.apache.camel:camel-spring-xml
  • camel-jmx ← downstream of org.apache.camel:camel-test-junit6
  • camel-jolt ← downstream of org.apache.camel:camel-test-junit6
  • camel-jooq ← downstream of org.apache.camel:camel-test-junit6
  • camel-joor ← downstream of org.apache.camel:camel-test-junit6
  • camel-jpa ← downstream of org.apache.camel:camel-test-junit6
  • camel-jq ← downstream of org.apache.camel:camel-test-junit6
  • camel-jsch ← downstream of org.apache.camel:camel-test-junit6
  • camel-jslt ← downstream of org.apache.camel:camel-test-junit6
  • camel-json-validator ← downstream of org.apache.camel:camel-test-junit6
  • camel-jsonapi ← downstream of org.apache.camel:camel-test-junit6
  • camel-jsonata ← downstream of org.apache.camel:camel-test-junit6
  • camel-jsonb ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-jsonpath ← downstream of org.apache.camel:camel-file
  • camel-jsoup ← downstream of org.apache.camel:camel-test-junit6
  • camel-jt400 ← downstream of org.apache.camel:camel-test-junit6
  • camel-jta ← downstream of org.apache.camel:camel-sql
  • camel-jte ← downstream of org.apache.camel:camel-test-junit6
  • camel-kafka ← downstream of org.apache.camel:camel-test-junit6
  • camel-kafka-common ← downstream of org.apache.camel:camel-test-junit6
  • camel-kafka-share ← downstream of org.apache.camel:camel-test-junit6
  • camel-kamelet ← downstream of org.apache.camel:camel-test-junit6
  • camel-kamelet-main-support ← downstream of org.apache.camel:camel-main
  • camel-keycloak ← downstream of org.apache.camel:camel-test-junit6
  • camel-knative ← downstream of org.apache.camel:camel-test-junit6
  • camel-knative-api ← downstream of org.apache.camel:camel-test-junit6
  • camel-knative-http ← downstream of org.apache.camel:camel-test-junit6
  • camel-kserve ← downstream of org.apache.camel:camel-test-junit6
  • camel-kubernetes ← downstream of org.apache.camel:camel-http
  • camel-kudu ← downstream of org.apache.camel:camel-test-junit6
  • camel-langchain4j-agent ← downstream of org.apache.camel:camel-test-junit6
  • camel-langchain4j-chat ← downstream of org.apache.camel:camel-test-junit6
  • camel-langchain4j-core ← downstream of org.apache.camel:camel-test-junit6
  • camel-langchain4j-embeddings ← downstream of org.apache.camel:camel-test-junit6
  • camel-langchain4j-embeddingstore ← downstream of org.apache.camel:camel-test-junit6
  • camel-langchain4j-ingest ← downstream of org.apache.camel:camel-test-junit6
  • camel-langchain4j-tokenizer ← downstream of org.apache.camel:camel-test-junit6
  • camel-langchain4j-web-search ← downstream of org.apache.camel:camel-test-junit6
  • camel-launcher-container ← downstream of org.apache.camel:camel-launcher
  • camel-ldap ← downstream of org.apache.camel:camel-test-junit6
  • camel-ldif ← downstream of org.apache.camel:camel-test-junit6
  • camel-lra ← downstream of org.apache.camel:camel-test-junit6
  • camel-lucene ← downstream of org.apache.camel:camel-test-junit6
  • camel-lumberjack ← downstream of org.apache.camel:camel-test-junit6
  • camel-lzf ← downstream of org.apache.camel:camel-test-junit6
  • camel-mail ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-mail-microsoft-oauth ← downstream of org.apache.camel:camel-mail
  • camel-main ← downstream of org.apache.camel:camel-test-junit6
  • camel-management ← downstream of org.apache.camel:camel-core
  • camel-mapstruct ← downstream of org.apache.camel:camel-test-junit6
  • camel-master ← downstream of org.apache.camel:camel-test-junit6
  • camel-maven-plugin ← downstream of org.apache.camel:camel-spring-main
  • camel-mcp-server ← downstream of org.apache.camel:camel-test-junit6
  • camel-mcp-server-api ← downstream of org.apache.camel:camel-test-junit6
  • camel-mdc ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-metrics ← downstream of org.apache.camel:camel-test-junit6
  • camel-micrometer ← downstream of org.apache.camel:camel-test-junit6
  • camel-micrometer-observability ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-micrometer-prometheus ← downstream of org.apache.camel:camel-platform-http-main
  • camel-microprofile-config ← downstream of org.apache.camel:camel-test-junit6
  • camel-microprofile-fault-tolerance ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-microprofile-health ← downstream of org.apache.camel:camel-test-junit6
  • camel-milo ← downstream of org.apache.camel:camel-test-junit6
  • camel-milvus ← downstream of org.apache.camel:camel-test-junit6
  • camel-mina ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-mina-sftp ← downstream of org.apache.camel:camel-test-junit6
  • camel-minio ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-mllp ← downstream of org.apache.camel:camel-test-junit6
  • camel-mongodb ← downstream of org.apache.camel:camel-test-junit6
  • camel-mongodb-gridfs ← downstream of org.apache.camel:camel-test-junit6
  • camel-mustache ← downstream of org.apache.camel:camel-test-junit6
  • camel-mvel ← downstream of org.apache.camel:camel-test-junit6
  • camel-mybatis ← downstream of org.apache.camel:camel-test-junit6
  • camel-nats ← downstream of org.apache.camel:camel-test-junit6
  • camel-neo4j ← downstream of org.apache.camel:camel-test-junit6
  • camel-netty ← downstream of org.apache.camel:camel-main
  • camel-netty-http ← downstream of org.apache.camel:camel-http
  • camel-oaipmh ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-oauth ← downstream of org.apache.camel:camel-test-junit6
  • camel-observability-services ← downstream of org.apache.camel:camel-opentelemetry2
  • camel-observation ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-ocsf ← downstream of org.apache.camel:camel-test-junit6
  • camel-odata ← downstream of org.apache.camel:camel-test-junit6
  • camel-ognl ← downstream of org.apache.camel:camel-test-junit6
  • camel-olingo2 ← downstream of org.apache.camel:camel-test-junit6
  • camel-olingo2-api ← downstream of org.apache.camel:camel-test-junit6
  • camel-olingo4 ← downstream of org.apache.camel:camel-test-junit6
  • camel-olingo4-api ← downstream of org.apache.camel:camel-test-junit6
  • camel-once ← downstream of org.apache.camel:camel-test-junit6
  • camel-opa ← downstream of org.apache.camel:camel-test-junit6
  • camel-openai ← downstream of org.apache.camel:camel-file
  • camel-openapi-java ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-openapi-validator ← downstream of org.apache.camel:camel-test-junit6
  • camel-openfeature ← downstream of org.apache.camel:camel-test-junit6
  • camel-openfga ← downstream of org.apache.camel:camel-test-junit6
  • camel-opensearch ← downstream of org.apache.camel:camel-test-junit6
  • camel-openstack ← downstream of org.apache.camel:camel-test-junit6
  • camel-opentelemetry ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-opentelemetry-metrics ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-opentelemetry2 ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-optaplanner ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-paho ← downstream of org.apache.camel:camel-test-junit6
  • camel-paho-mqtt5 ← downstream of org.apache.camel:camel-test-junit6
  • camel-parquet-avro ← downstream of org.apache.camel:camel-test-junit6
  • camel-pdf ← downstream of org.apache.camel:camel-test-junit6
  • camel-pg-replication-slot ← downstream of org.apache.camel:camel-test-junit6
  • camel-pgevent ← downstream of org.apache.camel:camel-test-junit6
  • camel-pgvector ← downstream of org.apache.camel:camel-test-junit6
  • camel-pinecone ← downstream of org.apache.camel:camel-test-junit6
  • camel-platform-http ← downstream of org.apache.camel:camel-test-junit6
  • camel-platform-http-jolokia ← downstream of org.apache.camel:camel-platform-http
  • camel-platform-http-main ← downstream of org.apache.camel:camel-test-junit6
  • camel-platform-http-vertx ← downstream of org.apache.camel:camel-file
  • camel-plc4x ← downstream of org.apache.camel:camel-test-junit6
  • camel-pqc ← downstream of org.apache.camel:camel-test-junit6
  • camel-printer ← downstream of org.apache.camel:camel-test-junit6
  • camel-protobuf ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-pubnub ← downstream of org.apache.camel:camel-test-junit6
  • camel-pulsar ← downstream of org.apache.camel:camel-test-junit6
  • camel-python ← downstream of org.apache.camel:camel-test-junit6
  • camel-python3 ← downstream of org.apache.camel:camel-test-junit6
  • camel-qdrant ← downstream of org.apache.camel:camel-test-junit6
  • camel-quartz ← downstream of org.apache.camel:camel-cron
  • camel-quickfix ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-quickjs ← downstream of org.apache.camel:camel-test-junit6
  • camel-reactive-streams ← downstream of org.apache.camel:camel-test-junit6
  • camel-reactor ← downstream of org.apache.camel:camel-test-junit6
  • camel-redis ← downstream of org.apache.camel:camel-test-junit6
  • camel-resilience4j ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-resilience4j-micrometer ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-resourceresolver-github ← downstream of org.apache.camel:camel-test-junit6
  • camel-rest-openapi ← downstream of org.apache.camel:camel-test-junit6
  • camel-rest-postman ← downstream of org.apache.camel:camel-test-junit6
  • camel-restdsl-openapi-plugin ← downstream of org.apache.camel:camel-servlet
  • camel-robotframework ← downstream of org.apache.camel:camel-test-junit6
  • camel-rocketmq ← downstream of org.apache.camel:camel-test-junit6
  • camel-rss ← downstream of org.apache.camel:camel-test-junit6
  • camel-rxjava ← downstream of org.apache.camel:camel-test-junit6
  • camel-salesforce ← downstream of org.apache.camel:camel-test-junit6
  • camel-salesforce-codegen ← downstream of org.apache.camel:camel-salesforce
  • camel-salesforce-maven-plugin ← downstream of org.apache.camel:camel-test-junit6
  • camel-sap-netweaver ← downstream of org.apache.camel:camel-test-junit6
  • camel-saxon ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-schematron ← downstream of org.apache.camel:camel-test-junit6
  • camel-semantic ← downstream of org.apache.camel:camel-test-junit6
  • camel-semantic-openai ← downstream of org.apache.camel:camel-test-junit6
  • camel-semantic-typesafe-ai ← downstream of org.apache.camel:camel-test-junit6
  • camel-semantic-wolf-defender ← downstream of org.apache.camel:camel-test-junit6
  • camel-servicenow ← downstream of org.apache.camel:camel-test-junit6
  • camel-servicenow-maven-plugin ← downstream of org.apache.camel:camel-test-junit6
  • camel-servlet ← downstream of org.apache.camel:camel-test-junit6
  • camel-shell ← downstream of org.apache.camel:camel-test-junit5
  • camel-shiro ← downstream of org.apache.camel:camel-test-junit6
  • camel-sjms ← downstream of org.apache.camel:camel-test-junit6
  • camel-sjms2 ← downstream of org.apache.camel:camel-test-junit6
  • camel-slack ← downstream of org.apache.camel:camel-test-junit6
  • camel-smb ← downstream of org.apache.camel:camel-file
  • camel-smooks ← downstream of org.apache.camel:camel-test-junit6
  • camel-smpp ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-snakeyaml ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-snmp ← downstream of org.apache.camel:camel-test-junit6
  • camel-soap ← downstream of org.apache.camel:camel-test-junit6
  • camel-solr ← downstream of org.apache.camel:camel-test-junit6
  • camel-spiffe ← downstream of org.apache.camel:camel-test-junit6
  • camel-splunk-hec ← downstream of org.apache.camel:camel-test-junit6
  • camel-spring ← downstream of org.apache.camel:camel-cron
  • camel-spring-ai-chat ← downstream of org.apache.camel:camel-test-junit6
  • camel-spring-ai-embeddings ← downstream of org.apache.camel:camel-test-junit6
  • camel-spring-ai-image ← downstream of org.apache.camel:camel-test-junit6
  • camel-spring-ai-vector-store ← downstream of org.apache.camel:camel-test-junit6
  • camel-spring-batch ← downstream of org.apache.camel:camel-test-junit6
  • camel-spring-cloud-config ← downstream of org.apache.camel:camel-test-junit6
  • camel-spring-jdbc ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-spring-ldap ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-spring-main ← downstream of org.apache.camel:camel-main
  • camel-spring-rabbitmq ← downstream of org.apache.camel:camel-http
  • camel-spring-redis ← downstream of org.apache.camel:camel-test-junit6
  • camel-spring-security ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-spring-ws ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-spring-xml ← downstream of org.apache.camel:camel-test-junit6
  • camel-sql ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-ssh ← downstream of org.apache.camel:camel-test-junit6
  • camel-state-store ← downstream of org.apache.camel:camel-test-main-junit5
  • camel-stax ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-stitch ← downstream of org.apache.camel:camel-test-junit6
  • camel-stream ← downstream of org.apache.camel:camel-test-junit6
  • camel-streamcaching-test ← downstream of org.apache.camel:camel-test-junit6
  • camel-stringtemplate ← downstream of org.apache.camel:camel-test-junit6
  • camel-stripe ← downstream of org.apache.camel:camel-test-junit6
  • camel-swift ← downstream of org.apache.camel:camel-test-junit6
  • camel-syslog ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-tahu ← downstream of org.apache.camel:camel-test-junit6
  • camel-tarfile ← downstream of org.apache.camel:camel-file
  • camel-telegram ← downstream of org.apache.camel:camel-test-junit6
  • camel-telemetry ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-telemetry-dev ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-tensorflow-serving ← downstream of org.apache.camel:camel-test-junit6
  • camel-test-citrus ← downstream of org.apache.camel:camel-test-junit6
  • camel-test-infra-all ← downstream of org.apache.camel:camel-test-infra-artemis
  • camel-test-infra-artemis ← downstream of org.apache.camel:camel-test-junit6
  • camel-test-infra-smb ← downstream of org.apache.camel:camel-test-junit6
  • camel-test-junit5 ← downstream of org.apache.camel:camel-file
  • camel-test-junit6 ← downstream of org.apache.camel:camel-file
  • camel-test-main-junit5 ← downstream of org.apache.camel:camel-test-junit5
  • camel-test-main-junit6 ← downstream of org.apache.camel:camel-test-junit6
  • camel-test-spring-junit5 ← downstream of org.apache.camel:camel-test-junit5
  • camel-test-spring-junit6 ← downstream of org.apache.camel:camel-test-junit6
  • camel-thrift ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-thymeleaf ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-tika ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-toon ← downstream of org.apache.camel:camel-test-junit5
  • camel-tracing ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-twilio ← downstream of org.apache.camel:camel-test-junit6
  • camel-twitter ← downstream of org.apache.camel:camel-test-junit6
  • camel-typesafe-ai ← downstream of org.apache.camel:camel-test-junit6
  • camel-ubl ← downstream of org.apache.camel:camel-test-junit5
  • camel-undertow ← downstream of org.apache.camel:camel-test-junit6
  • camel-undertow-spring-security ← downstream of org.apache.camel:camel-test-junit6
  • camel-univocity-parsers ← downstream of org.apache.camel:camel-spring-xml
  • camel-velocity ← downstream of org.apache.camel:camel-test-spring-junit6
  • camel-vertx ← downstream of org.apache.camel:camel-test-junit6
  • camel-vertx-http ← downstream of org.apache.camel:camel-test-junit6
  • camel-vertx-websocket ← downstream of org.apache.camel:camel-test-junit6
  • camel-wasm ← downstream of org.apache.camel:camel-test-junit6
  • camel-weather ← downstream of org.apache.camel:camel-test-junit6
  • camel-weaviate ← downstream of org.apache.camel:camel-test-junit6
  • camel-web3j ← downstream of org.apache.camel:camel-test-junit6
  • camel-webhook ← downstream of org.apache.camel:camel-test-junit6
  • camel-whatsapp ← downstream of org.apache.camel:camel-test-junit6
  • camel-wordpress ← downstream of org.apache.camel:camel-test-junit6
  • camel-workday ← downstream of org.apache.camel:camel-test-junit6
  • camel-xchange ← downstream of org.apache.camel:camel-test-junit6
  • camel-xj ← downstream of org.apache.camel:camel-test-junit6
  • camel-xml-io-dsl ← downstream of org.apache.camel:camel-test-junit6
  • camel-xml-jaxb-dsl ← downstream of org.apache.camel:camel-test-junit6
  • camel-xml-jaxb-dsl-test-definition ← downstream of org.apache.camel:camel-test-junit6
  • camel-xml-jaxb-dsl-test-spring ← downstream of org.apache.camel:camel-test-junit6
  • camel-xmlsecurity ← downstream of org.apache.camel:camel-test-junit6
  • camel-xmpp ← downstream of org.apache.camel:camel-test-junit6
  • camel-xslt-saxon ← downstream of org.apache.camel:camel-spring-xml
  • camel-yaml-dsl-validator ← downstream of org.apache.camel:camel-catalog
  • camel-yaml-dsl-validator-maven-plugin ← downstream of org.apache.camel:camel-yaml-dsl-validator
  • camel-zendesk ← downstream of org.apache.camel:camel-test-junit6
  • camel-zip-deflater ← downstream of org.apache.camel:camel-test-junit6
  • camel-zipfile ← downstream of org.apache.camel:camel-file
  • camel-zookeeper ← downstream of org.apache.camel:camel-file
  • camel-zookeeper-master ← downstream of org.apache.camel:camel-test-junit6
Modules with tests skipped (25)
  • apache-camel
  • camel-allcomponents
  • camel-catalog-console
  • camel-catalog-maven
  • camel-catalog-suggest
  • camel-componentdsl
  • camel-endpointdsl
  • camel-endpointdsl-support
  • camel-itest
  • camel-jbang-core
  • camel-jbang-it
  • camel-jbang-main
  • camel-jbang-plugin-edit
  • camel-jbang-plugin-generate
  • camel-jbang-plugin-kubernetes
  • camel-jbang-plugin-test
  • camel-kamelet-main
  • camel-launcher
  • camel-report-maven-plugin
  • camel-route-parser
  • camel-yaml-dsl
  • camel-yaml-dsl-deserializers
  • camel-yaml-dsl-maven-plugin
  • coverage
  • dummy-component

ℹ️ Shadow mode — Scalpel observes but does not affect test execution. Learn more

⚠️ Some tests are disabled on GitHub Actions (@DisabledIfSystemProperty(named = "ci.env.name")) and require manual verification:

  • core/camel-core: 4 test(s) disabled on GitHub Actions
Build reactor — dependencies compiled but only changed modules were tested (4 modules, 53.8s total)

Total reactor time: 53.8s

Module Duration Status
Camel :: Catalog :: Camel Catalog 25.7s SUCCESS
Camel :: Docs 19.8s SUCCESS
Camel :: File 8.3s SUCCESS
Camel :: Core n/a

Top 20 slowest modules:

  • Camel :: Catalog :: Camel Catalog (25.7s)
  • Camel :: Docs (19.8s)
  • Camel :: File (8.3s)

⚙️ View full build and test results

…, list one file past the limit

Review follow-up:
- the kept done file no longer admits only the files left: the polls consume every file of the
  directory while it is there, as they do whenever a done file is there. A Camel producer with
  doneFileName rewrites the done file after each file; with the gate its files written during the
  drain were rejected and then stranded when the done file was deleted. A failed last file is now
  tried again with the files left, as on main.
- with the eager limit, one file past maxMessagesPerPoll is listed (instead of every file) to know
  that the poll leaves files; when the listing stops there, the done files of the files listed are
  kept, and a kept done file is only deleted as gone after a complete listing.
- the done file kept for a file that was not started is the one of the file as polled, not of the
  file the preMove bound to the exchange.
- upgrade guide: pollEnrich and ConsumerTemplate.receive keep the done file until the last file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@allthingssecurity

Copy link
Copy Markdown
Contributor Author

Thanks for the thorough review. All three points are addressed in e47aeb8 (details in the inline replies):

  • The gate is gone. While the done file is kept, the polls consume every file of the directory, so a Camel producer that rewrites the done file during the drain no longer strands its files (new test with file:...?doneFileName=ready as the producer).
  • pollEnrich / ConsumerTemplate.receive: there is a new test and an upgrade-guide line. The full listing is replaced by listing one file past the limit.
  • preMove: the done file kept is the one of the file as polled.

On the description mismatch: with the gate removed, a last file that fails while files are left is tried again under the same done file, as on main. testFileThatAlwaysFailsWithFilesLeftDoesNotHoldDoneFile now pins that, since b.txt is tried twice before the done file is deleted. I have updated the PR description to match.

Tests: 14 in FileConsumerDoneFileNameFilesLeftTest. Against the previous commit, 4 of them fail (the producer, the file written meanwhile, the preMove case, and the retry of the failed last file). camel-file: 24 tests. The camel-core file tests: 474 run, 12 skipped, 0 failures. camel-ftp: the 17 done-file, maxMessagesPerPoll, consumer-template and pollEnrich ITs (24 tests) plus RemoteFileIgnoreDoPollErrorTest and SftpPreSortTest (14) all pass.

Claude Code on behalf of allthingssecurity

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well-structured fix for a real gap: done files for subdirectories that have been fully polled were not cleaned up when a GenericFileKeptDoneFiles strategy was in use. The core logic for the single-directory case looks correct.

Two substantive concerns before this merges:

1. Recursive-directory done-file leak under persistent truncated listings

GenericFileKeptDoneFiles.removeUnpolled (line 63, !listingComplete branch) calls kept.removeAll(listedDoneFiles) — which removes done files only for the entries that appeared in the current (truncated) listing. For a subdirectory that was emptied in a previous poll cycle, its done file will never appear in future truncated listings; the pruning never fires. As long as listings remain persistently cut (directory always returns more than maxMessagesPerPoll), that orphan done file stays on disk indefinitely. This is an edge case, but the fix specifically targets done-file hygiene — it's worth a comment in the code and, ideally, a test.

2. startBatch in the incomplete-listing path is a no-op

When listingCut=true, startDoneFileBatch(kept, files, false) is called (line 182), which ends up in startBatch(doneFiles, false) → kept.removeAll(listedDoneFiles). The caller then immediately calls listedDoneFiles.forEach(kept::keep) (line 188), which re-adds every entry that was just removed. Net effect: removeAll + addAll of the exact same set = no change. The comment in startBatch claims it "removes done files corresponding to listed files that are no longer needed" but it cannot — any entry removed by removeAll is put right back by the caller's forEach. Consider whether this branch needs a different strategy.

Minor:

  • Comment at line 278 ("the file as polled: the begin strategy may pre move it, and then binds the pre moved file to the exchange") reads as a sentence fragment — the leading verb is missing.
  • PR description vs test count: the description mentions 11 tests; the diff for FileConsumerDoneFileNameFilesLeftTest.java contains 14 @Test methods. The description would benefit from an update.
  • handleDoneFile rollback path (line 178): consider whether the done-file tracking in GenericFileOnCompletion should also reflect the moveFailed scenario — currently it's only triggered on rollback when moveFailed is configured. If moveFailed is absent, a failed exchange skips done-file tracking entirely; that may be intentional but worth a code comment.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @allthingssecurity.

Re-review of e47aeb8 against the commit I reviewed (f959c79). All three earlier points are fixed:

  • The admission gate is gone (GenericFileDoneFileAdmission removed, isMatched untouched). While the done file is kept, the polls consume every file of the directory, as main does whenever the done file is there. testFileWrittenByCamelProducerWhileFilesAreLeftIsConsumed pins the Camel producer case that rewrites the done file.
  • The polling consumer (pollEnrich, ConsumerTemplate.receive) is covered by testConsumerTemplateReceivesEveryFileOfTheDoneFile, and the 4.24 upgrade guide now says the done file is kept until the last file is received. Listing one file past the limit, instead of the whole directory, keeps the cost of that path small.
  • The not-started path now keeps the done file of the file as polled, captured before processExchange, so a failed download after preMove no longer points at <preMoveDir>/ready. testDownloadFailingAfterPreMoveKeepsTheDoneFileOfTheDirectory covers it.

The description mismatch I mentioned is gone too: with the gate dropped, a last file that failed is retried with the files left, and testFileThatAlwaysFailsWithFilesLeftDoesNotHoldDoneFile asserts the second attempt.

I traced the eager cut (N+1 listed, cut before sorting, so the same files the eager limit takes on main, with the extra file released from the in-progress and eager idempotent repositories), the non-eager cut, the batch stopped at shutdown, the exactly-N case (complete listing, done file deleted as before) and the browse consumer (custom processor, so no kept done files). ftp, sftp, smb and azure-files reach this through canPollMoreFiles and GenericFileConsumer.processExchange, and none of them overrides poll or processBatch. The docs change is mirrored in the catalog copy.

About the gnodet-bot review: the recursive point is not a regression. On main, only the directory of the last file of the batch loses its done file, so the done files of the other directories already stay. Here they are deleted once a complete listing finds their directory empty. The removeAll point is right but harmless (nit inline). The test count in the description is now correct.

Good to merge from my side once CI is green.

Claude Code on behalf of Claus Ibsen

@davsclaus davsclaus added this to the 4.24.0 milestone Oct 18, 2026
@davsclaus davsclaus added the bug Something isn't working label Oct 18, 2026
@davsclaus
davsclaus merged commit 0d9b605 into apache:main Oct 18, 2026
7 checks passed
@allthingssecurity
allthingssecurity deleted the camel-file-done-file-kept-while-files-left branch October 19, 2026 12:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants