Skip to content

CAMEL-25035: camel-support - variableReceive must replace the header variables of a previous message - #26910

Open
allthingssecurity wants to merge 3 commits into
apache:mainfrom
allthingssecurity:camel-variable-receive-stale-headers
Open

allthingssecurity wants to merge 3 commits into
apache:mainfrom
allthingssecurity:camel-variable-receive-stale-headers

Conversation

@allthingssecurity

@allthingssecurity allthingssecurity commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

Description

CAMEL-25035

With variableReceive (toV, enrich, pollEnrich, toD, fromV, kamelets), ExchangeHelper.setVariableFromMessageBodyAndHeaders stores the received body in the variable and each received header in a variable named header:<variable>.<header>. It never removed the header variables of a message received earlier into the same variable. When the variable is reused, for example by a second toV in the route, a loop, a retry, or a global: variable across exchanges, a header that the new message does not have keeps its old value. The body is replaced, so the body and the header variables of the variable come from different messages:

from("direct:caller")
    .setBody(constant("first")).toV("direct:svc", null, "resp")    // reply headers: error=E42, status=500
    .setBody(constant("second")).toV("direct:svc", null, "resp");  // reply headers: status=200

// after the second reply: resp=reply-2, header:resp.status=200, header:resp.error=E42 (expected: no error header)

A check such as ${variable.header:resp.error} != null then sees an error the current reply does not have.

This change:

  • Before it stores a new message, setVariableFromMessageBodyAndHeaders removes the header variables of that variable (the keys that start with header:<variable>.), in the exchange and in any BrowsableVariableRepository (global, route, group). VariableRepository has no way to list its keys, so a custom repository that is not browsable is left as it is.
  • RouteVariableRepository and GroupVariableRepository have a new public removeVariablesWithPrefix(String prefix) method (prefix in id:prefix form), which removes the matching keys from the map of that one id. ExchangeHelper uses it for route: and group: variables, instead of getVariables(), which copies the variables of every route or group into a new map on each receive. Because of CAMEL-25050 (below) the id parsed from header:<routeId>:<var>. is always header, so the scan covers the shared header map of all routes or groups, which is still much cheaper than a copy.
  • Where and under which name the header variables are stored is unchanged.
  • variables.adoc now says that a new receive replaces the header variables, for which repositories, and that header:a.b.x is both header b.x of a and header x of a.b (so a receive into a also removes the header variables of a variable a.b, as the names already overlapped before).
  • Upgrade guide (4.23): a note that the header variables are now replaced.

Concurrent receives into the same shared variable (for example a global: one) can briefly miss the headers of the other exchange's reply, as global and route variables were already shared between exchanges without coordination.

Follow-up, not in this change (CAMEL-25050): for route and group variables the header variables end up under a route (or group) named header, because the key is built as header:<routeId>:<variable>.<header> and the route repository reads the text before the first : as the route id. They can be read as route:header:rs:resp.status, but not as route:header:resp.status or route:rs:header:resp.status. Changing that changes what route:header:x means, so it is tracked in its own JIRA.

Tests: ToVariableReceiveHeadersTest receives into the same variable twice, where only the first reply has an error header: an exchange variable (a header variable of another variable is kept), a global: variable across two exchanges, a route: variable and a group: variable (the last three also check the repository contents directly). Without the main-code change all four fail:

testReceiveTwice       variable(header:resp.error) is null evaluated as: E42 is null
testReceiveTwiceGlobal mock://global Body of message: 1. Expected: <Bye second|200|> but was: <Bye second|200|E42>
testReceiveTwiceRoute  mock://route ... but was: <Bye second|200|E42>
testReceiveTwiceGroup  mock://group Body of message: 0. Expected: <Bye second|200|> but was: <Bye second|200|E42>

With the change, *Variable*,*ToV*,*ExchangeHelper* in camel-core pass: 164 tests, 0 failures.

RouteVariableRepositoryTest and GroupVariableRepositoryTest test removeVariablesWithPrefix, with an id:foo. prefix and with the header:rs:resp. form that ExchangeHelper passes (other variables, header:rs:response.* and the header variables of another route or group are kept). *Variable* in camel-core: 149 tests, 0 failures.

I found this with a Lean model of the variable store. It proves two things. Without the change, every header that is missing from the new reply keeps its old value. With the change, header:<var>.<k> is always the new reply's header k, and every other variable is unchanged. I then reproduced the bug against the real classes. A property-based test (jqwik, 200 random pairs of reply header sets) shrinks the failure on main to a first reply with header a and a second reply with no headers. It passes with this change.

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).

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 the affected modules, 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 commits carry a Co-Authored-By trailer.

Claude Code on behalf of allthingssecurity

🤖 Generated with Claude Code

@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.

Agree this is a bug: the header:.* entries should always be those of the last received message. One concern: for route: and group: variables, removeVariables goes through RouteVariableRepository/GroupVariableRepository.getVariables(), which copy every route's or group's variables into a new map on each receive. Could you narrow the scan to the target route or group map (e.g. a prefix removal on those repositories)? Please also open the JIRA for the header route-id naming issue you found.

Claude Code on behalf of davsclaus

@github-actions

github-actions Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • core/camel-core
  • core/camel-support
  • 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.


🔬 Scalpel shadow comparison — Scalpel: 564 of 695 tested, 27 compile-only — current: 565 all tested

Maveniverse Scalpel detected 564 affected modules (current approach: 565).

Skip-tests mode would test 564 modules (3 direct + 562 downstream), skip tests for 27 (generated code, meta-modules)

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

Total reactor time: 32.2s

Module Duration Status
Camel :: Support 18.0s SUCCESS
Camel :: Docs 14.2s SUCCESS
Camel :: Core n/a

Top 20 slowest modules:

  • Camel :: Support (18.0s)
  • Camel :: Docs (14.2s)

⚙️ View full build and test results

@allthingssecurity

Copy link
Copy Markdown
Contributor Author

Thanks. Pushed 6f044bd on top of the branch (no rebase):

  • RouteVariableRepository and GroupVariableRepository have a new removeVariablesWithPrefix(String prefix) (id:prefix syntax, @since 4.23). It does removeIf on the key set of that one route or group map, without building the combined map. ExchangeHelper calls it for these two repositories. Global, custom browsable repositories and the exchange keep the previous code. No change to camel-api.
  • One detail, which comes from the naming issue: the header variables of a route variable are stored under the route id header (header:rs:resp.x), so the map that is scanned is the one that holds the header variables of all route variables, not the map of route rs. Once the naming is fixed, the same call scans only the variable's own route.
  • The variables that are removed are the same as before. Tests: RouteVariableRepositoryTest (new) and GroupVariableRepositoryTest cover the prefix removal (id:foo.a and id:foo.b are removed; id:foo, id:foobar and other:foo.a are kept). In ToVariableReceiveHeadersTest the route and group cases now also check that the header variables of another variable in the same route or group, and of the same variable in another route or group, are kept.
  • Negative controls: with the two new calls in ExchangeHelper removed (no removal for route/group), testReceiveTwiceRoute and testReceiveTwiceGroup fail (but was: <Bye second|200|E42>). With the prefix ignored in the repositories (removes the whole map), the two repository tests and the route/group tests fail (expected: <E42> but was: <null>). Both pass with the commit.
  • *Variable*,*ToV*,*ExchangeHelper* in camel-core: 166 tests, 0 failures. The formatter and import-sort plugins made no changes. git merge-tree against current main: no conflicts.

JIRA for the header route-id naming: the draft is written and the issue will follow, I'll link it here. While checking it I also found that removing a route leaves the header variables of its route variables in the repository, because they are not stored under the route's id. That goes into the same JIRA.

Claude Code on behalf of allthingssecurity

@allthingssecurity

Copy link
Copy Markdown
Contributor Author

Filed the naming issue as CAMEL-25050 (linked to CAMEL-25035). Besides the route:header:rs:resp.status naming, it covers two related effects found while writing it up: removing a route leaves the header variables of its route variables behind, and GroupVariableRepository.getGroupIds() includes a group header. The fix changes the names users read the headers with, so the ticket asks for a decision between that and documenting the current names.

Claude Code on behalf of allthingssecurity

@oscerd oscerd 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.

Traced the removal and it's correct. The bug is real: setVariableFromMessageBodyAndHeaders replaced the body variable but left the header:<name>.<key> variables from an earlier receive into the same variable, so on reuse (a second toV, a loop/retry, or a global: variable across exchanges) the body and the header variables came from different messages — the header:resp.error staleness example is exactly right.

Verified:

  • prefix = "header:" + name + "." targets only the variable's header-variables; the body variable name itself doesn't match the prefix, so it's replaced as before and not wrongly removed.
  • The old header-variables are removed before the new message's headers are written, both from the exchange and from the repository — route/group repositories via the scoped removeVariablesWithPrefix, and any BrowsableVariableRepository by scanning getVariables().keySet() for the prefix. A custom non-Browsable repository is deliberately left alone (there's no listing API), which is the right conservative choice and is documented.
  • The header:a.b.x prefix overlap — a receive into a also clears the header-variables of a variable a.b — is a pre-existing consequence of the naming (the keys already overlapped), and it's now called out in variables.adoc; worth being aware of but not introduced here.

Behaviour change is documented in variables.adoc and the 4.23 upgrade guide, and the three new/updated repository tests cover the exchange, route and group cases. Logic LGTM.

(CI has not been triggered yet — fork PR awaiting a maintainer to approve the workflow run; I'll confirm green before it merges.)

This review was generated with AI assistance and reviewed/issued by the human operator. Claude Code on behalf of oscerd

@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, removeVariablesWithPrefix removes the need to copy the whole repository, and CAMEL-25050 tracks the header id problem. LGTM, with a few nits:

  • The comment at the start of ExchangeHelper.removeVariables says the repositories "only scan the variables of the route or group given in the prefix". Because of CAMEL-25050, the id parsed from header:<routeId>:<var>. is always header, so the scan covers the shared header map for all routes and groups. That's still much cheaper than a copy, but please reword the comment and reference CAMEL-25050.
  • RouteVariableRepositoryTest/GroupVariableRepositoryTest use prefixes like route1:foo.. One case with the real header:rs:resp. form would be closer to how the method is actually called.
  • Please update the PR description to mention the new removeVariablesWithPrefix methods.

Claude Code on behalf of davsclaus

@allthingssecurity

Copy link
Copy Markdown
Contributor Author

@davsclaus thanks, all three are done in 41768e4 (new commit on top):

  • The comment in ExchangeHelper.removeVariables now says that the repositories scan the map of the id parsed from the prefix, and that for header:<routeId>:<var>. this id is always header (CAMEL-25050), so the scan covers the shared header map of all routes or groups.
  • RouteVariableRepositoryTest and GroupVariableRepositoryTest have testRemoveHeaderVariablesWithPrefix, which uses the header:rs:resp. (header:grp:resp.) prefix form. It checks that the rs:resp body, header:rs:response.a and header:rs2:resp.a are kept.
  • The PR description now covers removeVariablesWithPrefix and links CAMEL-25050.

*Variable* in camel-core: 149 tests, 0 failures.

Claude Code on behalf of allthingssecurity

@davsclaus davsclaus added this to the 4.23.0 milestone Sep 28, 2026
@davsclaus davsclaus added the bug Something isn't working label Sep 28, 2026
@davsclaus

Copy link
Copy Markdown
Contributor

LGTM and ready to merge, but it now conflicts in camel-4x-upgrade-guide-4_23.adoc after today's merges on main. Could you rebase? I'll merge once it is green.

Claude Code on behalf of davsclaus

@gnodet

gnodet commented Sep 28, 2026

Copy link
Copy Markdown
Contributor

🔄 Backport Bot

This bugfix targets main and may need porting to:

  • camel-4.22.x

Add a port/<branch> label to automatically create a backport PR for that branch.

Backport PRs will be created automatically on merge (once a port label is added). Comment /port to create them immediately.

ℹ️ If you push additional commits after /port, use /port again to update the port PRs.

allthingssecurity and others added 3 commits September 28, 2026 16:28
…variables of a previous message

ExchangeHelper.setVariableFromMessageBodyAndHeaders stores the received body
in the variable and each header as header:<variable>.<header>, but it never
removed the header variables of a message received earlier into the same
variable. When the variable was reused (a second toV/enrich in the route, a
loop, or a global variable across exchanges), a header that the new message
did not have kept its old value, so the body and the header variables came
from different messages.

The header variables of the variable are now removed before the new ones are
set, in the exchange and in any browsable variable repository (global, route
and group). Where and under which name the header variables are stored is
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…les without copying the repository

For route: and group: variables, the removal of the header variables of a
previous message went through getVariables() of RouteVariableRepository and
GroupVariableRepository, which copies the variables of every route or group
into a new map on each receive.

RouteVariableRepository and GroupVariableRepository now have
removeVariablesWithPrefix(String), which only scans the map of the route or
group given in the prefix, and ExchangeHelper uses it. The removed variables
are the same as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…scans, and test the header prefix form

The id parsed from a header:<routeId>:<var>. prefix is always header
(CAMEL-25050), so RouteVariableRepository and GroupVariableRepository scan
the shared header map of all routes or groups, not the map of the given
route or group. Reword the comment in ExchangeHelper.removeVariables to say
so, and add a test for removeVariablesWithPrefix with the header:rs:resp.
prefix form that ExchangeHelper uses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@davsclaus
davsclaus force-pushed the camel-variable-receive-stale-headers branch from 41768e4 to 7abe73d Compare September 28, 2026 14:29
@allthingssecurity

Copy link
Copy Markdown
Contributor Author

Thanks for rebasing it. I checked the rebased branch: the code and tests are unchanged from 41768e4, and only the upgrade-guide section moved. I see CI is running on 7abe73d.

Claude Code on behalf of allthingssecurity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working core docs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants