You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by "davsclaus (via GitHub)" <gi...@apache.org> on 2026/08/25 14:39:36 UTC

[PR] CAMEL-24484: camel-file - readLockRemoveOnCommit=false must not remove a pre-existing idempotent entry [camel]

davsclaus opened a new pull request, #25726:
URL: https://github.com/apache/camel/pull/25726

   ## Summary
   
   Fixes a mailing-list-reported regression where `readLockRemoveOnCommit=false` (and `readLockRemoveOnRollback=false`) is silently ignored: a previously committed idempotent-repository entry gets removed the next time a file with the same idempotent key is polled, even though it should be retained.
   
   Two independent places in camel-file assumed "file did not start processing" implies "we must have added this idempotent entry ourselves, so it's safe to remove" — which is false whenever the entry pre-existed (e.g. from an earlier, already-committed run, or another node in a cluster):
   
   1. `FileIdempotentRepositoryReadLockStrategy` / `FileIdempotentChangedRepositoryReadLockStrategy` / `FileIdempotentRenameRepositoryReadLockStrategy`: `releaseExclusiveReadLockOnAbort()` unconditionally called `idempotentRepository.remove(key)`. This method only ever runs after `acquireExclusiveReadLock()` failed — either because the key already existed (not ours to touch), or because a secondary check (changed/rename) failed after we added it, in which case `acquireExclusiveReadLock()` already cleaned up its own key. So the extra remove was always either wrong or redundant.
   2. `GenericFileConsumer`'s "not started" cleanup (added by CAMEL-21947 / commit 71090b4b0b6) removed from `endpoint.getIdempotentRepository()` whenever `isIdempotentEager()` (defaults to `true`) and a repository is configured — without checking `isIdempotent()`. For `readLock=idempotent-changed`/`-rename` setups the repository is populated by the read-lock strategy, not by the polling-time eager dedup path CAMEL-21947 intended to guard, so this reached into entries it never added.
   
   ## Test plan
   
   - [x] Added `FileIdempotentChangedReadLockRemoveOnCommitTest`, which reproduces the exact reported scenario: process a file with `readLock=idempotent-changed` and `readLockRemoveOnCommit=false`, then re-drop a file with the same idempotent key and assert the original entry is retained (previously failed — the duplicate got reprocessed and/or the entry was wiped).
   - [x] `mvn test` in `components/camel-file` — all pass.
   - [x] `mvn test -Dtest="org.apache.camel.component.file.**"` in `core/camel-core` — 431 tests, 0 failures.
   - [x] `camel-ftp` compiles against the changed API; its `FtpReadLockNotStartedIT` (CAMEL-21947 regression test) explicitly sets `idempotent=true`, so it is unaffected by the added `isIdempotent()` guard.
   
   _Claude Opus 4.8 on behalf of davsclaus_


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24484: camel-file - readLockRemoveOnCommit=false must not remove a pre-existing idempotent entry [camel]

Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on PR #25726:
URL: https://github.com/apache/camel/pull/25726#issuecomment-5423684650

   Addressed the abort-after-successful-acquire correctness issue from @gnodet's first review (replies on the inline comments). Summary:
   
   - `releaseExclusiveReadLockOnAbort` in all three idempotent read-lock strategies now only removes the idempotent key when *this strategy* added it during `acquireExclusiveReadLock` (tracked via a new `Exchange.FILE_LOCK_IDEMPOTENT_ACQUIRED` property, following the same pattern `MarkerFileExclusiveReadLockStrategy` uses for `FILE_LOCK_FILE_ACQUIRED`). Pre-existing keys are left untouched; keys we acquired are still cleaned up if `begin()` fails afterwards for an unrelated reason (e.g. a `preMove` rename failure) — so this no longer reverts CAMEL-24093 for that scenario.
   - Added `FileIdempotentRepositoryReadLockStrategyAbortTest`, a direct unit test on the strategy covering both branches. Confirmed it fails against the previous (no-op) version of this PR.
   - The wording nit on the old comment is moot — the comment was rewritten as part of this fix.
   - Kept the test class/method `public` (not applying the minor visibility suggestion, per maintainer preference).
   - Noted for later: backport to `camel-4.18.x`/`camel-4.22.x` per the two reviews — will follow up with backport PR(s) after this merges.
   
   _Claude Sonnet 5 on behalf of @davsclaus_


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24484: camel-file - readLockRemoveOnCommit=false must not remove a pre-existing idempotent entry [camel]

Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus merged PR #25726:
URL: https://github.com/apache/camel/pull/25726


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24484: camel-file - readLockRemoveOnCommit=false must not remove a pre-existing idempotent entry [camel]

Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on code in PR #25726:
URL: https://github.com/apache/camel/pull/25726#discussion_r3861624950


##########
components/camel-file/src/main/java/org/apache/camel/component/file/strategy/FileIdempotentRepositoryReadLockStrategy.java:
##########
@@ -95,8 +95,9 @@ public boolean acquireExclusiveReadLock(GenericFileOperations<File> operations,
     public void releaseExclusiveReadLockOnAbort(
             GenericFileOperations<File> operations, GenericFile<File> file, Exchange exchange)
             throws Exception {

Review Comment:
   Confirmed and fixed in 42173c8. You're right that `releaseExclusiveReadLockOnAbort` can also run after a successful acquire — `GenericFileConsumer.processExchange()` calls `abort()` whenever `begin()` returns `false` *or throws*, and `GenericFileRenameProcessStrategy.begin()` calls `super.begin()` (which acquires the lock) before running `beginRenamer.renameFile()` for `preMove`, which can throw afterwards.
   
   Applied your suggested approach: added `Exchange.FILE_LOCK_IDEMPOTENT_ACQUIRED`, set at the end of `acquireExclusiveReadLock` (mirroring `MarkerFileExclusiveReadLockStrategy`'s `FILE_LOCK_FILE_ACQUIRED` pattern), so `releaseExclusiveReadLockOnAbort` only removes the key when we actually own it — correctly handling both this PR's pre-existing-key scenario and CAMEL-24093's abort-after-acquire scenario. Added `FileIdempotentRepositoryReadLockStrategyAbortTest` which directly exercises both branches (verified it fails against the previous no-op version).
   
   _Claude Sonnet 5 on behalf of @davsclaus_



##########
components/camel-file/src/main/java/org/apache/camel/component/file/strategy/FileIdempotentChangedRepositoryReadLockStrategy.java:
##########
@@ -115,8 +115,10 @@ public boolean acquireExclusiveReadLock(GenericFileOperations<File> operations,
     public void releaseExclusiveReadLockOnAbort(

Review Comment:
   Confirmed and fixed in 42173c8. You're right that `releaseExclusiveReadLockOnAbort` can also run after a successful acquire — `GenericFileConsumer.processExchange()` calls `abort()` whenever `begin()` returns `false` *or throws*, and `GenericFileRenameProcessStrategy.begin()` calls `super.begin()` (which acquires the lock) before running `beginRenamer.renameFile()` for `preMove`, which can throw afterwards.
   
   Applied your suggested approach: added `Exchange.FILE_LOCK_IDEMPOTENT_ACQUIRED`, set at the end of `acquireExclusiveReadLock` (mirroring `MarkerFileExclusiveReadLockStrategy`'s `FILE_LOCK_FILE_ACQUIRED` pattern), so `releaseExclusiveReadLockOnAbort` only removes the key when we actually own it — correctly handling both this PR's pre-existing-key scenario and CAMEL-24093's abort-after-acquire scenario. Added `FileIdempotentRepositoryReadLockStrategyAbortTest` which directly exercises both branches (verified it fails against the previous no-op version).
   
   _Claude Sonnet 5 on behalf of @davsclaus_



##########
components/camel-file/src/main/java/org/apache/camel/component/file/strategy/FileIdempotentRenameRepositoryReadLockStrategy.java:
##########
@@ -107,8 +107,10 @@ public boolean acquireExclusiveReadLock(GenericFileOperations<File> operations,
     public void releaseExclusiveReadLockOnAbort(

Review Comment:
   Confirmed and fixed in 42173c8. You're right that `releaseExclusiveReadLockOnAbort` can also run after a successful acquire — `GenericFileConsumer.processExchange()` calls `abort()` whenever `begin()` returns `false` *or throws*, and `GenericFileRenameProcessStrategy.begin()` calls `super.begin()` (which acquires the lock) before running `beginRenamer.renameFile()` for `preMove`, which can throw afterwards.
   
   Applied your suggested approach: added `Exchange.FILE_LOCK_IDEMPOTENT_ACQUIRED`, set at the end of `acquireExclusiveReadLock` (mirroring `MarkerFileExclusiveReadLockStrategy`'s `FILE_LOCK_FILE_ACQUIRED` pattern), so `releaseExclusiveReadLockOnAbort` only removes the key when we actually own it — correctly handling both this PR's pre-existing-key scenario and CAMEL-24093's abort-after-acquire scenario. Added `FileIdempotentRepositoryReadLockStrategyAbortTest` which directly exercises both branches (verified it fails against the previous no-op version).
   
   _Claude Sonnet 5 on behalf of @davsclaus_



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24484: camel-file - readLockRemoveOnCommit=false must not remove a pre-existing idempotent entry [camel]

Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on PR #25726:
URL: https://github.com/apache/camel/pull/25726#issuecomment-5426298618

   Addressed the remaining review nit: made the two new test classes and their `@Test` methods package-private per project convention (commit ffedbf3).
   
   _Claude Sonnet 5 on behalf of davsclaus_


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24484: camel-file - readLockRemoveOnCommit=false must not remove a pre-existing idempotent entry [camel]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #25726:
URL: https://github.com/apache/camel/pull/25726#issuecomment-5412409730

   :star2: Thank you for your contribution to the Apache Camel project! :star2:
     :robot: CI automation will test this PR automatically.
   
     :camel: 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](https://camel.apache.org/community/team/#committers) have access to the summary.
     
     :warning: Be careful when sharing logs. Review their contents before sharing them publicly.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24484: camel-file - readLockRemoveOnCommit=false must not remove a pre-existing idempotent entry [camel]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #25726:
URL: https://github.com/apache/camel/pull/25726#issuecomment-5413900505

   <!-- ci-tested-modules -->
   :test_tube: **CI tested the following changed modules:**
   
   - `components/camel-file`
   - `core/camel-core`
   
   > :information_source: 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.
   
   ---
   
   <details><summary>:microscope: Scalpel shadow comparison — Scalpel: 490 tested, 29 compile-only — current: 490 all tested</summary>
   
   [Maveniverse Scalpel](https://github.com/maveniverse/scalpel) detected **519 affected modules** (current approach: 490).
   
   <details><summary>:warning: Modules only in Scalpel (29)</summary>
   
   - `apache-camel`
   - `camel-allcomponents`
   - `camel-catalog`
   - `camel-catalog-console`
   - `camel-catalog-lucene`
   - `camel-catalog-maven`
   - `camel-catalog-suggest`
   - `camel-componentdsl`
   - `camel-csimple-maven-plugin`
   - `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`
   - `docs`
   - `dummy-component`
   
   </details>
   
   **Skip-tests mode would test 490 modules** (2 direct + 488 downstream), **skip tests for 29** (generated code, meta-modules)
   
   <details><summary>Modules Scalpel would test (490)</summary>
   
   - `archetypes`
   - `camel-a2a`
   - `camel-activemq`
   - `camel-activemq6`
   - `camel-ai-observability`
   - `camel-ai-tool`
   - `camel-alibaba-eventbridge`
   - `camel-alibaba-fc`
   - `camel-alibaba-kms`
   - `camel-alibaba-mns`
   - `camel-alibaba-oss`
   - `camel-alibaba-sms`
   - `camel-amqp`
   - `camel-api-component-maven-plugin`
   - `camel-arangodb`
   - `camel-archetype-api-component`
   - `camel-archetype-component`
   - `camel-archetype-dataformat`
   - `camel-archetype-java`
   - `camel-archetype-main`
   - `camel-archetype-spring`
   - `camel-as2`
   - `camel-as2-api`
   - `camel-asn1`
   - `camel-asterisk`
   - `camel-atmosphere-websocket`
   - `camel-atom`
   - `camel-attachments`
   - `camel-avro`
   - `camel-avro-rpc`
   - `camel-aws-bedrock`
   - `camel-aws-cloudtrail`
   - `camel-aws-config`
   - `camel-aws-parameter-store`
   - `camel-aws-secrets-manager`
   - `camel-aws-security-hub`
   - `camel-aws2-athena`
   - `camel-aws2-comprehend`
   - `camel-aws2-cw`
   - `camel-aws2-ddb`
   - `camel-aws2-ec2`
   - `camel-aws2-ecs`
   - `camel-aws2-eks`
   - `camel-aws2-eventbridge`
   - `camel-aws2-iam`
   - `camel-aws2-kinesis`
   - `camel-aws2-kms`
   - `camel-aws2-lambda`
   - `camel-aws2-mq`
   - `camel-aws2-msk`
   - `camel-aws2-polly`
   - `camel-aws2-redshift`
   - `camel-aws2-rekognition`
   - `camel-aws2-s3`
   - `camel-aws2-s3-vectors`
   - `camel-aws2-ses`
   - `camel-aws2-sns`
   - `camel-aws2-sqs`
   - `camel-aws2-step-functions`
   - `camel-aws2-sts`
   - `camel-aws2-textract`
   - `camel-aws2-timestream`
   - `camel-aws2-transcribe`
   - `camel-aws2-translate`
   - `camel-azure-cosmosdb`
   - `camel-azure-eventgrid`
   - `camel-azure-eventhubs`
   - `camel-azure-files`
   - `camel-azure-functions`
   - `camel-azure-key-vault`
   - `camel-azure-schema-registry`
   - `camel-azure-servicebus`
   - `camel-azure-storage-blob`
   - `camel-azure-storage-datalake`
   - `camel-azure-storage-queue`
   - `camel-barcode`
   - `camel-base64`
   - `camel-bean-validator`
   - `camel-beanio`
   - `camel-bindy`
   - `camel-bonita`
   - `camel-box`
   - `camel-braintree`
   - `camel-caffeine`
   - `camel-camunda`
   - `camel-cassandraql`
   - `camel-cbor`
   - `camel-chatscript`
   - `camel-chunk`
   - `camel-cli-connector`
   - `camel-cli-debug`
   - `camel-clickhouse`
   - `camel-clickup`
   - `camel-cloudevents`
   - `camel-cm-sms`
   - `camel-coap`
   - `camel-cometd`
   - `camel-console`
   - `camel-consul`
   - `camel-core`
   - `camel-core-all`
   - `camel-couchbase`
   - `camel-couchdb`
   - `camel-cron`
   - `camel-crypto`
   - `camel-crypto-pgp`
   - `camel-csimple-joor`
   - `camel-csv`
   - `camel-cxf-common`
   - `camel-cxf-rest`
   - `camel-cxf-soap`
   - `camel-cxf-spring-common`
   - `camel-cxf-spring-rest`
   - `camel-cxf-spring-soap`
   - `camel-cxf-spring-transport`
   - `camel-cxf-transport`
   - `camel-cyberark-vault`
   - `camel-dapr`
   - `camel-datasonnet`
   - `camel-debezium-common`
   - `camel-debezium-db2`
   - `camel-debezium-maven-plugin`
   - `camel-debezium-mongodb`
   - `camel-debezium-mysql`
   - `camel-debezium-oracle`
   - `camel-debezium-postgres`
   - `camel-debezium-sqlserver`
   - `camel-debug`
   - `camel-dfdl`
   - `camel-dhis2`
   - `camel-dhis2-api`
   - `camel-dhis2-parent`
   - `camel-diagram`
   - `camel-digitalocean`
   - `camel-disruptor`
   - `camel-djl`
   - `camel-dns`
   - `camel-docker`
   - `camel-docling`
   - `camel-drill`
   - `camel-dropbox`
   - `camel-dsl-modeline`
   - `camel-duckdb`
   - `camel-dynamic-router`
   - `camel-ehcache`
   - `camel-elasticsearch`
   - `camel-elasticsearch-rest-client`
   - `camel-event`
   - `camel-exec`
   - `camel-fastjson`
   - `camel-fhir`
   - `camel-file`
   - `camel-file-watch`
   - `camel-flatpack`
   - `camel-flink`
   - `camel-flowable`
   - `camel-fop`
   - `camel-fory`
   - `camel-freemarker`
   - `camel-ftp`
   - `camel-ftp-common`
   - `camel-geocoder`
   - `camel-git`
   - `camel-github2`
   - `camel-google-bigquery`
   - `camel-google-calendar`
   - `camel-google-common`
   - `camel-google-drive`
   - `camel-google-firestore`
   - `camel-google-functions`
   - `camel-google-mail`
   - `camel-google-pubsub`
   - `camel-google-secret-manager`
   - `camel-google-sheets`
   - `camel-google-speech-to-text`
   - `camel-google-storage`
   - `camel-google-text-to-speech`
   - `camel-google-vertexai`
   - `camel-google-vision`
   - `camel-graphql`
   - `camel-grok`
   - `camel-groovy`
   - `camel-grpc`
   - `camel-gson`
   - `camel-hashicorp-vault`
   - `camel-hazelcast`
   - `camel-headersmap`
   - `camel-hl7`
   - `camel-http`
   - `camel-http-base`
   - `camel-http-common`
   - `camel-huaweicloud-dms`
   - `camel-huaweicloud-frs`
   - `camel-huaweicloud-functiongraph`
   - `camel-huaweicloud-iam`
   - `camel-huaweicloud-imagerecognition`
   - `camel-huaweicloud-obs`
   - `camel-huaweicloud-smn`
   - `camel-huggingface`
   - `camel-ibm-cos`
   - `camel-ibm-secrets-manager`
   - `camel-ibm-watson-discovery`
   - `camel-ibm-watson-language`
   - `camel-ibm-watson-speech-to-text`
   - `camel-ibm-watson-text-to-speech`
   - `camel-ibm-watsonx-ai`
   - `camel-ibm-watsonx-data`
   - `camel-ical`
   - `camel-iec60870`
   - `camel-iggy`
   - `camel-ignite`
   - `camel-infinispan`
   - `camel-infinispan-common`
   - `camel-infinispan-embedded`
   - `camel-influxdb`
   - `camel-influxdb2`
   - `camel-irc`
   - `camel-ironmq`
   - `camel-iso8583`
   - `camel-jackson`
   - `camel-jackson-avro`
   - `camel-jackson-protobuf`
   - `camel-jackson3`
   - `camel-jackson3-avro`
   - `camel-jackson3-protobuf`
   - `camel-jackson3xml`
   - `camel-jacksonxml`
   - `camel-jactl`
   - `camel-jandex`
   - `camel-jasypt`
   - `camel-java-joor-dsl`
   - `camel-javascript`
   - `camel-jaxb`
   - `camel-jbang-console`
   - `camel-jbang-mcp`
   - `camel-jbang-plugin-mcp`
   - `camel-jbang-plugin-route-parser`
   - `camel-jbang-plugin-tui`
   - `camel-jbang-plugin-validate`
   - `camel-jcache`
   - `camel-jcr`
   - `camel-jdbc`
   - `camel-jetty`
   - `camel-jetty-common`
   - `camel-jfr`
   - `camel-jgroups`
   - `camel-jgroups-raft`
   - `camel-jira`
   - `camel-jms`
   - `camel-jmx`
   - `camel-jolt`
   - `camel-jooq`
   - `camel-joor`
   - `camel-jpa`
   - `camel-jq`
   - `camel-jsch`
   - `camel-jslt`
   - `camel-json-patch`
   - `camel-json-validator`
   - `camel-jsonapi`
   - `camel-jsonata`
   - `camel-jsonb`
   - `camel-jsonpath`
   - `camel-jsoup`
   - `camel-jt400`
   - `camel-jta`
   - `camel-jte`
   - `camel-kafka`
   - `camel-kamelet`
   - `camel-kamelet-main-support`
   - `camel-keycloak`
   - `camel-knative`
   - `camel-knative-api`
   - `camel-knative-http`
   - `camel-kserve`
   - `camel-kubernetes`
   - `camel-kudu`
   - `camel-langchain4j-agent`
   - `camel-langchain4j-chat`
   - `camel-langchain4j-core`
   - `camel-langchain4j-embeddings`
   - `camel-langchain4j-embeddingstore`
   - `camel-langchain4j-tokenizer`
   - `camel-langchain4j-tools`
   - `camel-langchain4j-web-search`
   - `camel-launcher-container`
   - `camel-ldap`
   - `camel-ldif`
   - `camel-leveldb`
   - `camel-lra`
   - `camel-lucene`
   - `camel-lumberjack`
   - `camel-lzf`
   - `camel-mail`
   - `camel-mail-microsoft-oauth`
   - `camel-main`
   - `camel-management`
   - `camel-mapstruct`
   - `camel-master`
   - `camel-maven-plugin`
   - `camel-mcp-server`
   - `camel-mcp-server-api`
   - `camel-mdc`
   - `camel-metrics`
   - `camel-micrometer`
   - `camel-micrometer-observability`
   - `camel-micrometer-prometheus`
   - `camel-microprofile-config`
   - `camel-microprofile-fault-tolerance`
   - `camel-microprofile-health`
   - `camel-milo`
   - `camel-milvus`
   - `camel-mina`
   - `camel-mina-sftp`
   - `camel-minio`
   - `camel-mllp`
   - `camel-mongodb`
   - `camel-mongodb-gridfs`
   - `camel-mustache`
   - `camel-mvel`
   - `camel-mybatis`
   - `camel-nats`
   - `camel-neo4j`
   - `camel-netty`
   - `camel-netty-http`
   - `camel-oaipmh`
   - `camel-oauth`
   - `camel-observability-services`
   - `camel-observation`
   - `camel-ocsf`
   - `camel-ognl`
   - `camel-olingo2`
   - `camel-olingo2-api`
   - `camel-olingo4`
   - `camel-olingo4-api`
   - `camel-once`
   - `camel-openai`
   - `camel-openapi-java`
   - `camel-openapi-validator`
   - `camel-opensearch`
   - `camel-openstack`
   - `camel-opentelemetry`
   - `camel-opentelemetry-metrics`
   - `camel-opentelemetry2`
   - `camel-optaplanner`
   - `camel-paho`
   - `camel-paho-mqtt5`
   - `camel-parquet-avro`
   - `camel-pdf`
   - `camel-pg-replication-slot`
   - `camel-pgevent`
   - `camel-pgvector`
   - `camel-pinecone`
   - `camel-platform-http`
   - `camel-platform-http-jolokia`
   - `camel-platform-http-main`
   - `camel-platform-http-vertx`
   - `camel-plc4x`
   - `camel-pqc`
   - `camel-printer`
   - `camel-protobuf`
   - `camel-pubnub`
   - `camel-pulsar`
   - `camel-python`
   - `camel-python3`
   - `camel-qdrant`
   - `camel-quartz`
   - `camel-quickfix`
   - `camel-reactive-executor-tomcat`
   - `camel-reactive-executor-vertx`
   - `camel-reactive-streams`
   - `camel-reactor`
   - `camel-redis`
   - `camel-resilience4j`
   - `camel-resilience4j-micrometer`
   - `camel-resourceresolver-github`
   - `camel-rest-openapi`
   - `camel-rest-postman`
   - `camel-restdsl-openapi-plugin`
   - `camel-robotframework`
   - `camel-rocketmq`
   - `camel-rss`
   - `camel-rxjava`
   - `camel-salesforce`
   - `camel-salesforce-codegen`
   - `camel-salesforce-maven-plugin`
   - `camel-sap-netweaver`
   - `camel-saxon`
   - `camel-schematron`
   - `camel-servicenow`
   - `camel-servicenow-maven-plugin`
   - `camel-servlet`
   - `camel-shell`
   - `camel-shiro`
   - `camel-sjms`
   - `camel-sjms2`
   - `camel-slack`
   - `camel-smb`
   - `camel-smooks`
   - `camel-smpp`
   - `camel-snakeyaml`
   - `camel-snmp`
   - `camel-soap`
   - `camel-solr`
   - `camel-splunk`
   - `camel-splunk-hec`
   - `camel-spring`
   - `camel-spring-ai-chat`
   - `camel-spring-ai-embeddings`
   - `camel-spring-ai-image`
   - `camel-spring-ai-vector-store`
   - `camel-spring-batch`
   - `camel-spring-cloud-config`
   - `camel-spring-jdbc`
   - `camel-spring-ldap`
   - `camel-spring-main`
   - `camel-spring-rabbitmq`
   - `camel-spring-redis`
   - `camel-spring-security`
   - `camel-spring-ws`
   - `camel-spring-xml`
   - `camel-sql`
   - `camel-ssh`
   - `camel-state-store`
   - `camel-state-store-caffeine`
   - `camel-state-store-infinispan`
   - `camel-state-store-redis`
   - `camel-stax`
   - `camel-stitch`
   - `camel-stream`
   - `camel-streamcaching-test`
   - `camel-stringtemplate`
   - `camel-stripe`
   - `camel-swift`
   - `camel-syslog`
   - `camel-tahu`
   - `camel-tarfile`
   - `camel-telegram`
   - `camel-telemetry`
   - `camel-telemetry-dev`
   - `camel-tensorflow-serving`
   - `camel-test-infra-all`
   - `camel-test-infra-artemis`
   - `camel-test-infra-core`
   - `camel-test-infra-smb`
   - `camel-test-junit5`
   - `camel-test-junit6`
   - `camel-test-main-junit5`
   - `camel-test-main-junit6`
   - `camel-test-spring-junit5`
   - `camel-test-spring-junit6`
   - `camel-threadpoolfactory-vertx`
   - `camel-thrift`
   - `camel-thymeleaf`
   - `camel-tika`
   - `camel-tracing`
   - `camel-twilio`
   - `camel-twitter`
   - `camel-ubl`
   - `camel-undertow`
   - `camel-undertow-spring-security`
   - `camel-univocity-parsers`
   - `camel-velocity`
   - `camel-vertx`
   - `camel-vertx-http`
   - `camel-vertx-websocket`
   - `camel-wasm`
   - `camel-weather`
   - `camel-weaviate`
   - `camel-web3j`
   - `camel-webhook`
   - `camel-whatsapp`
   - `camel-wordpress`
   - `camel-workday`
   - `camel-xchange`
   - `camel-xj`
   - `camel-xml-io-dsl`
   - `camel-xml-jaxb-dsl`
   - `camel-xml-jaxb-dsl-test-definition`
   - `camel-xml-jaxb-dsl-test-spring`
   - `camel-xmlsecurity`
   - `camel-xmpp`
   - `camel-xslt-saxon`
   - `camel-yaml-dsl-validator`
   - `camel-yaml-dsl-validator-maven-plugin`
   - `camel-zendesk`
   - `camel-zip-deflater`
   - `camel-zipfile`
   - `camel-zookeeper`
   - `camel-zookeeper-master`
   
   </details>
   
   <details><summary>Modules with tests skipped (29)</summary>
   
   - `apache-camel`
   - `camel-allcomponents`
   - `camel-catalog`
   - `camel-catalog-console`
   - `camel-catalog-lucene`
   - `camel-catalog-maven`
   - `camel-catalog-suggest`
   - `camel-componentdsl`
   - `camel-csimple-maven-plugin`
   - `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`
   - `docs`
   - `dummy-component`
   
   </details>
   
   > :information_source: Shadow mode — Scalpel observes but does not affect test execution. [Learn more](https://github.com/maveniverse/scalpel)
   
   </details>
   
   :warning: **Some tests are disabled on GitHub Actions** (`@DisabledIfSystemProperty(named = "ci.env.name")`) and require manual verification:
   
   - `core/camel-core`: 2 test(s) disabled on GitHub Actions
   
   <details><summary>Build reactor — dependencies compiled but only changed modules were tested (518 modules)</summary>
   
   - Camel :: AI :: A2A
   - Camel :: AI :: ChatScript
   - Camel :: AI :: Deep Java Library
   - Camel :: AI :: Docling
   - Camel :: AI :: Hugging Face
   - Camel :: AI :: KServe
   - Camel :: AI :: LangChain4j :: Agent
   - Camel :: AI :: LangChain4j :: Chat
   - Camel :: AI :: LangChain4j :: Core
   - Camel :: AI :: LangChain4j :: Embedding
   - Camel :: AI :: LangChain4j :: EmbeddingStore
   - Camel :: AI :: LangChain4j :: Tokenizer
   - Camel :: AI :: LangChain4j :: Tools (deprecated)
   - Camel :: AI :: LangChain4j :: Web Search
   - Camel :: AI :: MCP Server
   - Camel :: AI :: MCP Server API
   - Camel :: AI :: Milvus
   - Camel :: AI :: Neo4j
   - Camel :: AI :: Observability
   - Camel :: AI :: OpenAI
   - Camel :: AI :: PGVector
   - Camel :: AI :: Pinecone
   - Camel :: AI :: Qdrant
   - Camel :: AI :: TensorFlow Serving
   - Camel :: AI :: Tool
   - Camel :: AI :: Weaviate
   - Camel :: AMQP
   - Camel :: AS2 :: API
   - Camel :: AS2 :: Component
   - Camel :: ASN.1
   - Camel :: AWS CloudTrail
   - Camel :: AWS Config
   - Camel :: AWS Redshift Data
   - Camel :: AWS Rekognition
   - Camel :: AWS Security Hub
   - Camel :: AWS Step Functions
   - Camel :: AWS Timestream
   - Camel :: AWS2 :: Transcribe
   - Camel :: AWS2 Athena
   - Camel :: AWS2 Bedrock
   - Camel :: AWS2 CW
   - Camel :: AWS2 Comprehend
   - Camel :: AWS2 DDB
   - Camel :: AWS2 EC2
   - Camel :: AWS2 ECS
   - Camel :: AWS2 EKS
   - Camel :: AWS2 Eventbridge
   - Camel :: AWS2 IAM
   - Camel :: AWS2 KMS
   - Camel :: AWS2 Kinesis
   - Camel :: AWS2 Lambda
   - Camel :: AWS2 MQ
   - Camel :: AWS2 MSK
   - Camel :: AWS2 Parameter Store
   - Camel :: AWS2 Polly
   - Camel :: AWS2 S3
   - Camel :: AWS2 S3 Vectors
   - Camel :: AWS2 SES
   - Camel :: AWS2 SNS
   - Camel :: AWS2 SQS
   - Camel :: AWS2 STS
   - Camel :: AWS2 Secrets Manager
   - Camel :: AWS2 Textract
   - Camel :: AWS2 Translate
   - Camel :: ActiveMQ 5.x
   - Camel :: ActiveMQ 6.x
   - Camel :: Alibaba Cloud :: EventBridge
   - Camel :: Alibaba Cloud :: Function Compute (FC)
   - Camel :: Alibaba Cloud :: Key Management Service (KMS)
   - Camel :: Alibaba Cloud :: Message Service (MNS)
   - Camel :: Alibaba Cloud :: OSS
   - Camel :: Alibaba Cloud :: Short Message Service (SMS)
   - Camel :: All Components Sync point
   - Camel :: All Core Sync point
   - Camel :: ArangoDB
   - Camel :: Archetypes
   - Camel :: Archetypes :: API Component
   - Camel :: Archetypes :: Component
   - Camel :: Archetypes :: Data Format
   - Camel :: Archetypes :: Java Router
   - Camel :: Archetypes :: Main
   - Camel :: Archetypes :: Spring XML Based Router (deprecated)
   - Camel :: Assembly
   - Camel :: Asterisk
   - Camel :: Atmosphere WebSocket Servlet
   - Camel :: Atom
   - Camel :: Attachments
   - Camel :: Avro
   - Camel :: Avro RPC
   - Camel :: Azure :: CosmosDB
   - Camel :: Azure :: Event Grid
   - Camel :: Azure :: Event Hubs
   - Camel :: Azure :: Files
   - Camel :: Azure :: Functions
   - Camel :: Azure :: Key Vault
   - Camel :: Azure :: Schema Registry
   - Camel :: Azure :: ServiceBus
   - Camel :: Azure :: Storage Blob
   - Camel :: Azure :: Storage Datalake
   - Camel :: Azure :: Storage Queue
   - Camel :: Barcode
   - Camel :: Base64
   - Camel :: Bean validator
   - Camel :: BeanIO
   - Camel :: Bindy
   - Camel :: Bonita
   - Camel :: Box :: Component
   - Camel :: Braintree
   - Camel :: CBOR
   - Camel :: CM SMS
   - Camel :: CSV
   - Camel :: CXF :: Common
   - Camel :: CXF :: Common :: Spring
   - Camel :: CXF :: REST
   - Camel :: CXF :: REST :: Spring
   - Camel :: CXF :: SOAP
   - Camel :: CXF :: SOAP :: Spring
   - Camel :: CXF :: Transport
   - Camel :: CXF :: Transport :: Spring
   - Camel :: Caffeine
   - Camel :: Camunda
   - Camel :: Cassandra CQL
   - Camel :: Catalog :: CSimple Maven Plugin (deprecated)
   - Camel :: Catalog :: Camel Catalog
   - Camel :: Catalog :: Camel Report Maven Plugin
   - Camel :: Catalog :: Camel Route Parser
   - Camel :: Catalog :: Console
   - Camel :: Catalog :: Dummy Component
   - Camel :: Catalog :: Lucene (deprecated)
   - Camel :: Catalog :: Maven
   - Camel :: Catalog :: Suggest
   - Camel :: Chunk
   - Camel :: ClickHouse
   - Camel :: ClickUp
   - Camel :: CloudEvents
   - Camel :: CoAP
   - Camel :: Cometd
   - Camel :: Common Telemetry
   - Camel :: Common Tracing (deprecated)
   - Camel :: Component DSL
   - Camel :: Console
   - Camel :: Consul
   - Camel :: Core
   - Camel :: CouchDB
   - Camel :: Couchbase
   - Camel :: Coverage
   - Camel :: Cron
   - Camel :: Crypto
   - Camel :: Crypto PGP
   - Camel :: CyberArk Vault
   - Camel :: DFDL
   - Camel :: DHIS2
   - Camel :: DHIS2 :: Parent
   - Camel :: DHIS2 API
   - Camel :: DNS
   - Camel :: DSL :: CLI Connector
   - Camel :: DSL :: CLI Debug
   - Camel :: DSL :: Modeline
   - Camel :: Dapr
   - Camel :: DataSonnet
   - Camel :: Debezium :: Common
   - Camel :: Debezium :: DB2
   - Camel :: Debezium :: Maven Plugin
   - Camel :: Debezium :: MongoDB
   - Camel :: Debezium :: MySQL
   - Camel :: Debezium :: Oracle
   - Camel :: Debezium :: PostgreSQL
   - Camel :: Debezium :: SQL Server
   - Camel :: Debugging
   - Camel :: Diagram
   - Camel :: DigitalOcean (deprecated)
   - Camel :: Disruptor
   - Camel :: Docker
   - Camel :: Docs
   - Camel :: Drill
   - Camel :: Dropbox
   - Camel :: DuckDB
   - Camel :: Dynamic Router
   - Camel :: Ehcache
   - Camel :: ElasticSearch Rest Client
   - Camel :: Elasticsearch Java API Client
   - Camel :: Endpoint DSL
   - Camel :: Endpoint DSL :: Support
   - Camel :: Event
   - Camel :: Exec
   - Camel :: FHIR
   - Camel :: FOP
   - Camel :: FTP
   - Camel :: FTP Common
   - Camel :: Fastjson
   - Camel :: File
   - Camel :: File Watch
   - Camel :: FlatPack
   - Camel :: Flink
   - Camel :: Flowable
   - Camel :: Fory
   - Camel :: Freemarker
   - Camel :: Geocoder
   - Camel :: Git
   - Camel :: GitHub2
   - Camel :: Google :: BigQuery
   - Camel :: Google :: Calendar
   - Camel :: Google :: Common
   - Camel :: Google :: Drive
   - Camel :: Google :: Firestore
   - Camel :: Google :: Functions
   - Camel :: Google :: Mail
   - Camel :: Google :: PubSub
   - Camel :: Google :: Secret Manager
   - Camel :: Google :: Sheets
   - Camel :: Google :: Speech To Text
   - Camel :: Google :: Storage
   - Camel :: Google :: Text To Speech
   - Camel :: Google :: Vertex AI
   - Camel :: Google :: Vision
   - Camel :: GraphQL
   - Camel :: Grok
   - Camel :: Groovy
   - Camel :: Gson
   - Camel :: HL7
   - Camel :: HTTP
   - Camel :: HTTP :: Base
   - Camel :: HTTP :: Common
   - Camel :: HashiCorp :: Key Vault
   - Camel :: HazelCast
   - Camel :: Headers Map (deprecated)
   - Camel :: Huawei Cloud :: DMS
   - Camel :: Huawei Cloud :: FaceRecognition
   - Camel :: Huawei Cloud :: FunctionGraph
   - Camel :: Huawei Cloud :: IAM
   - Camel :: Huawei Cloud :: ImageRecognition
   - Camel :: Huawei Cloud :: OBS
   - Camel :: Huawei Cloud :: SimpleNotification
   - Camel :: IBM :: Cloud Object Storage
   - Camel :: IBM :: Secrets Manager
   - Camel :: IBM :: Watson Discovery
   - Camel :: IBM :: Watson Language
   - Camel :: IBM :: Watson Speech to Text
   - Camel :: IBM :: Watson Text to Speech
   - Camel :: IBM :: watsonx.ai
   - Camel :: IBM :: watsonx.data
   - Camel :: IEC 60870 (deprecated)
   - Camel :: IRC (deprecated)
   - Camel :: ISO-8583
   - Camel :: Iggy
   - Camel :: Ignite
   - Camel :: Infinispan :: Common
   - Camel :: Infinispan :: Embedded
   - Camel :: Infinispan :: Remote
   - Camel :: InfluxDB
   - Camel :: InfluxDB2
   - Camel :: Integration Tests
   - Camel :: Integration Tests :: Stream Caching Tests
   - Camel :: IronMQ
   - Camel :: JAXB
   - Camel :: JBang :: Console
   - Camel :: JBang :: Core
   - Camel :: JBang :: Integration tests
   - Camel :: JBang :: MCP
   - Camel :: JBang :: Main
   - Camel :: JBang :: Plugin :: Edit
   - Camel :: JBang :: Plugin :: Generate
   - Camel :: JBang :: Plugin :: Kubernetes
   - Camel :: JBang :: Plugin :: MCP
   - Camel :: JBang :: Plugin :: Route Parser
   - Camel :: JBang :: Plugin :: TUI
   - Camel :: JBang :: Plugin :: Testing
   - Camel :: JBang :: Plugin :: Validate
   - Camel :: JCR
   - Camel :: JCache
   - Camel :: JDBC
   - Camel :: JGroups
   - Camel :: JGroups Raft
   - Camel :: JIRA
   - Camel :: JMS
   - Camel :: JMX
   - Camel :: JOOQ
   - Camel :: JPA
   - Camel :: JQ
   - Camel :: JSON validator
   - Camel :: JSON-B
   - Camel :: JSONATA
   - Camel :: JSon Path
   - Camel :: JSonApi
   - Camel :: JSoup
   - Camel :: JTA
   - Camel :: Jackson
   - Camel :: Jackson 3
   - Camel :: Jackson 3 Avro
   - Camel :: Jackson 3 Protobuf
   - Camel :: Jackson 3 XML
   - Camel :: Jackson Avro
   - Camel :: Jackson Protobuf
   - Camel :: Jackson XML
   - Camel :: Jactl
   - Camel :: Jandex
   - Camel :: Jasypt
   - Camel :: Java DSL with jOOR
   - Camel :: Java Flight Recorder
   - Camel :: Java Template Engine
   - Camel :: Java Toolbox for IBM i
   - Camel :: JavaScript
   - Camel :: Jetty
   - Camel :: Jetty :: Common
   - Camel :: Jolt
   - Camel :: Jsch
   - Camel :: Jslt
   - Camel :: JsonPatch (deprecated)
   - Camel :: Kafka
   - Camel :: Kamelet
   - Camel :: Kamelet Main
   - Camel :: Kamelet Main :: Support
   - Camel :: Keycloak
   - Camel :: Knative API
   - Camel :: Knative Component
   - Camel :: Knative HTTP
   - Camel :: Kubernetes
   - Camel :: Kudu
   - Camel :: LDAP
   - Camel :: LDIF
   - Camel :: LZF
   - Camel :: Launcher
   - Camel :: Launcher :: Container
   - Camel :: LevelDB (deprecated)
   - Camel :: Long-Running-Action
   - Camel :: Lucene
   - Camel :: Lumberjack
   - Camel :: MDC
   - Camel :: MINA
   - Camel :: MINA SFTP
   - Camel :: MLLP
   - Camel :: MVEL
   - Camel :: Mail
   - Camel :: Mail :: Microsoft OAuth
   - Camel :: Main
   - Camel :: Management
   - Camel :: MapStruct
   - Camel :: Master
   - Camel :: Maven Plugins :: Camel API Component Plugin
   - Camel :: Maven Plugins :: Camel Maven Plugin
   - Camel :: Maven Plugins :: OpenApi REST DSL Generator
   - Camel :: Metrics
   - Camel :: MicroProfile :: Config
   - Camel :: MicroProfile :: Fault Tolerance
   - Camel :: MicroProfile :: Health
   - Camel :: Micrometer
   - Camel :: Micrometer :: Observability 2
   - Camel :: Micrometer :: Observation (deprecated)
   - Camel :: Micrometer :: Prometheus
   - Camel :: Milo
   - Camel :: MinIO
   - Camel :: MongoDB
   - Camel :: MongoDB GridFS
   - Camel :: Mustache
   - Camel :: MyBatis
   - Camel :: Nats
   - Camel :: Netty
   - Camel :: Netty HTTP
   - Camel :: OAIPMH
   - Camel :: OAuth
   - Camel :: OCSF
   - Camel :: OGNL (deprecated)
   - Camel :: Observability Services
   - Camel :: Olingo2 (Deprecated) :: API
   - Camel :: Olingo2 (Deprecated) :: Component
   - Camel :: Olingo4 (Deprecated) :: API
   - Camel :: Olingo4 (Deprecated) :: Component
   - Camel :: Once
   - Camel :: OpenAPI :: Validator
   - Camel :: OpenApi Java
   - Camel :: OpenSearch Java API Client
   - Camel :: OpenStack
   - Camel :: OpenTelemetry (deprecated)
   - Camel :: Opentelemetry 2
   - Camel :: Opentelemetry Metrics
   - Camel :: OptaPlanner
   - Camel :: PDF
   - Camel :: PLC4X
   - Camel :: PQC
   - Camel :: Paho (deprecated)
   - Camel :: Paho MQTT 5
   - Camel :: Parquet Avro
   - Camel :: PgEvent
   - Camel :: PgReplicationSlot
   - Camel :: Platform HTTP
   - Camel :: Platform HTTP :: Jolokia
   - Camel :: Platform HTTP :: Main
   - Camel :: Platform HTTP :: Vert.x
   - Camel :: Printer
   - Camel :: Protobuf
   - Camel :: PubNub
   - Camel :: Pulsar
   - Camel :: Python
   - Camel :: Python 3
   - Camel :: Quartz
   - Camel :: QuickFIX/J
   - Camel :: REST OpenApi
   - Camel :: REST Postman
   - Camel :: RSS
   - Camel :: Reactive Executor :: Tomcat (deprecated)
   - Camel :: Reactive Executor :: Vert.x (deprecated)
   - Camel :: Reactive Streams
   - Camel :: Reactor
   - Camel :: Redis
   - Camel :: Resilience4j
   - Camel :: Resilience4j :: Micrometer
   - Camel :: ResourceResolver GitHub
   - Camel :: RobotFramework
   - Camel :: RocketMQ
   - Camel :: RxJava
   - Camel :: SAP NetWeaver
   - Camel :: SMB
   - Camel :: SMPP
   - Camel :: SNMP
   - Camel :: SOAP
   - Camel :: SQL
   - Camel :: SSH
   - Camel :: SWIFT
   - Camel :: Salesforce
   - Camel :: Salesforce :: CodeGen
   - Camel :: Salesforce :: Maven Plugin
   - Camel :: Saxon
   - Camel :: Schematron
   - Camel :: ServiceNow :: Component
   - Camel :: ServiceNow :: Maven Plugin
   - Camel :: Servlet
   - Camel :: Shell
   - Camel :: Shiro
   - Camel :: Simple JMS
   - Camel :: Simple JMS2
   - Camel :: Slack
   - Camel :: Smooks :: Parent
   - Camel :: SnakeYAML
   - Camel :: Solr
   - Camel :: Splunk (deprecated)
   - Camel :: Splunk HEC
   - Camel :: Spring
   - Camel :: Spring AI :: Chat
   - Camel :: Spring AI :: Embeddings
   - Camel :: Spring AI :: Image
   - Camel :: Spring AI :: Vector Store
   - Camel :: Spring Batch
   - Camel :: Spring Cloud Config
   - Camel :: Spring JDBC
   - Camel :: Spring LDAP
   - Camel :: Spring Main
   - Camel :: Spring RabbitMQ
   - Camel :: Spring Redis
   - Camel :: Spring Security
   - Camel :: Spring Web Services
   - Camel :: Spring XML
   - Camel :: StAX
   - Camel :: State Store
   - Camel :: State Store :: Caffeine
   - Camel :: State Store :: Infinispan
   - Camel :: State Store :: Redis
   - Camel :: Stitch
   - Camel :: Stream
   - Camel :: StringTemplate
   - Camel :: Stripe
   - Camel :: Syslog
   - Camel :: Tahu
   - Camel :: Tar File
   - Camel :: Telegram
   - Camel :: Telemetry :: Dev
   - Camel :: Test :: JUnit5
   - Camel :: Test :: JUnit6
   - Camel :: Test :: Main :: JUnit5
   - Camel :: Test :: Main :: JUnit6
   - Camel :: Test :: Spring :: JUnit5
   - Camel :: Test Infra :: All test services
   - Camel :: Test Infra :: Artemis
   - Camel :: Test Infra :: Core
   - Camel :: Test Infra :: Server Message Block
   - Camel :: Thread Pool Factory :: Vert.x (deprecated)
   - Camel :: Thrift
   - Camel :: Thymeleaf
   - Camel :: Tika
   - Camel :: Twilio
   - Camel :: Twitter
   - Camel :: UBL
   - Camel :: Undertow
   - Camel :: Undertow Spring Security
   - Camel :: UniVocity Parsers
   - Camel :: Velocity
   - Camel :: Vert.x :: HTTP
   - Camel :: Vert.x :: WebSocket
   - Camel :: Vertx
   - Camel :: Wasm
   - Camel :: Weather
   - Camel :: Web3j
   - Camel :: Webhook
   - Camel :: Whatsapp
   - Camel :: Wordpress
   - Camel :: Workday
   - Camel :: XChange
   - Camel :: XJ
   - Camel :: XML DSL Jaxb :: Test :: Definition
   - Camel :: XML DSL Jaxb :: Test :: Spring
   - Camel :: XML DSL with camel-xml-io
   - Camel :: XML DSL with camel-xml-jaxb
   - Camel :: XML Security
   - Camel :: XMPP
   - Camel :: XSLT Saxon
   - Camel :: YAML DSL
   - Camel :: YAML DSL :: Deserializers
   - Camel :: YAML DSL :: Maven Plugins
   - Camel :: YAML DSL :: Validator
   - Camel :: YAML DSL :: Validator Maven Plugin
   - Camel :: Zendesk
   - Camel :: Zip Deflater
   - Camel :: Zip File
   - Camel :: Zookeeper
   - Camel :: Zookeeper Master
   - Camel :: csimple jOOR (deprecated)
   - Camel :: gRPC
   - Camel :: iCal
   - Camel :: jOOR
   
   </details>
   
   ---
   :gear: [View full build and test results](https://github.com/apache/camel/actions/runs/32866689110)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24484: camel-file - readLockRemoveOnCommit=false must not remove a pre-existing idempotent entry [camel]

Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on code in PR #25726:
URL: https://github.com/apache/camel/pull/25726#discussion_r3861626445


##########
core/camel-core/src/test/java/org/apache/camel/component/file/strategy/FileIdempotentChangedReadLockRemoveOnCommitTest.java:
##########
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.file.strategy;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.spi.Registry;
+import org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Awaitility.await;
+
+public class FileIdempotentChangedReadLockRemoveOnCommitTest extends ContextTestSupport {

Review Comment:
   Thanks for the catch — keeping `public` here per the maintainer's preference; not changing this one.
   
   _Claude Sonnet 5 on behalf of @davsclaus_



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24484: camel-file - readLockRemoveOnCommit=false must not remove a pre-existing idempotent entry [camel]

Posted by "gnodet (via GitHub)" <gi...@apache.org>.
gnodet commented on code in PR #25726:
URL: https://github.com/apache/camel/pull/25726#discussion_r3857122924


##########
components/camel-file/src/main/java/org/apache/camel/component/file/strategy/FileIdempotentChangedRepositoryReadLockStrategy.java:
##########
@@ -115,8 +115,10 @@ public boolean acquireExclusiveReadLock(GenericFileOperations<File> operations,
     public void releaseExclusiveReadLockOnAbort(

Review Comment:
   Same concern as the `FileIdempotentRepositoryReadLockStrategy` — `releaseExclusiveReadLockOnAbort` can be reached after a successful acquire when `preMove` fails. The exchange-property approach would fix both scenarios.



##########
components/camel-file/src/main/java/org/apache/camel/component/file/strategy/FileIdempotentRepositoryReadLockStrategy.java:
##########
@@ -95,8 +95,9 @@ public boolean acquireExclusiveReadLock(GenericFileOperations<File> operations,
     public void releaseExclusiveReadLockOnAbort(
             GenericFileOperations<File> operations, GenericFile<File> file, Exchange exchange)
             throws Exception {

Review Comment:
   The comment says "this is only called after acquireExclusiveReadLock failed," but `releaseExclusiveReadLockOnAbort` can also be called after a **successful** acquire when `begin()` throws for reasons beyond lock failure.
   
   Specifically: `GenericFileRenameProcessStrategy.begin()` calls `super.begin()` (which acquires the lock successfully), then attempts `preMove` rename. If `renameFile()` throws `GenericFileOperationFailedException`, the exception propagates to `GenericFileConsumer.processExchange()`, `begin` stays `false`, and `abort()` is called — which invokes this method. With this change making it a no-op, the key added during the successful `acquireExclusiveReadLock` leaks permanently.
   
   This effectively reverts CAMEL-24093 point #2 (commit `82507e3eab0`) for this specific scenario.
   
   **Suggestion:** Track acquisition state via an exchange property (like `MarkerFileExclusiveReadLockStrategy` already does with `FILE_LOCK_FILE_ACQUIRED`). Then `releaseExclusiveReadLockOnAbort` can check the property to distinguish "acquire never succeeded" from "acquire succeeded but something else failed" — correctly handling both this PR's pre-existing-key scenario and CAMEL-24093's abort-after-acquire scenario.



##########
components/camel-file/src/main/java/org/apache/camel/component/file/strategy/FileIdempotentRenameRepositoryReadLockStrategy.java:
##########
@@ -107,8 +107,10 @@ public boolean acquireExclusiveReadLock(GenericFileOperations<File> operations,
     public void releaseExclusiveReadLockOnAbort(

Review Comment:
   Same concern — consider the exchange-property tracking approach here as well.



##########
core/camel-core/src/test/java/org/apache/camel/component/file/strategy/FileIdempotentChangedReadLockRemoveOnCommitTest.java:
##########
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.file.strategy;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.spi.Registry;
+import org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Awaitility.await;
+
+public class FileIdempotentChangedReadLockRemoveOnCommitTest extends ContextTestSupport {

Review Comment:
   Minor: per project conventions, test class and test methods should be package-private (no `public` modifier).
   
   ```suggestion
   class FileIdempotentChangedReadLockRemoveOnCommitTest extends ContextTestSupport {
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org