Skip to content

CAMEL-26327: camel-core - Routing Slip / Dynamic Router: a redelivered step no longer hangs after a nested routing slip - #28750

Merged
davsclaus merged 2 commits into
apache:mainfrom
allthingssecurity:camel-core-routing-slip-redelivery-hang-v2
Oct 31, 2026
Merged

davsclaus merged 2 commits into
apache:mainfrom
allthingssecurity:camel-core-routing-slip-redelivery-hang-v2

Conversation

@allthingssecurity

@allthingssecurity allthingssecurity commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Description

CAMEL-26327

A routing slip or dynamic router step that the error handler redelivers never completes when the route it called ran a routing slip or dynamic router on the same exchange and then failed. The caller waits forever and the exchange stays in flight:

errorHandler(defaultErrorHandler().maximumRedeliveries(1).redeliveryDelay(0));
from("direct:start").routingSlip(constant("direct:sub"));
from("direct:sub")
    .doTry()
        .routingSlip(constant("mock:inner"))
        .throwException(new IllegalStateException("boom"))
    .endDoTry()
    .doFinally()
    .end();

template.send("direct:start", e -> e.getMessage().setBody("in"));   // never returns

Three things are needed: a routing slip or dynamic router step with redelivery, a called route (direct passes the same exchange) that runs a routing slip or dynamic router, and an exception that leaves the called route. It can leave through a doTry without a matching doCatch, a route with noErrorHandler(), or a rethrow. With a dead letter channel the message never reaches the dead letter endpoint. A recipientList in the called route, or no redelivery, returns as expected.

The cause:

  • RoutingSlip.processExchange stores the producer of the step in the exchange property CamelSlipProducer. The error handler that wraps the step calls RoutingSlipProcessor, which reads the producer back from that property on every attempt (the design of CAMEL-12120, which replaced the cache of error handlers of CAMEL-8393 / CAMEL-10048). DynamicRouter extends RoutingSlip and shares this code.
  • When a step completes, its callback removed the property. A routing slip in the called route runs on the same exchange, so it overwrote the outer step's producer and then removed it.
  • The outer step's error handler then redelivers, and RoutingSlipProcessor.process threw NullPointerException: "producer" is null. The redelivery runs as reactive work: DefaultReactiveExecutor logs a WARN that ends with "This exception is ignored", and the callback is never called.

Changes:

  • RoutingSlip.processExchange keeps the producer that was in the property before it sets its own, and the step's callback puts it back. It removes the property only when there was none, so nothing is left on the exchange after the outermost slip, as CAMEL-12120 intended when it added the property and its cleanup.
  • RoutingSlipProcessor fails the exchange with an IllegalStateException and calls the callback when the property is missing, instead of throwing. A missing producer can no longer turn into a hang. The error handler handles that exception like any other (redelivery, then the dead letter channel or the caller).
  • No other production code sets or reads CamelSlipProducer (git grep). The callback is still called exactly once on both the synchronous and the asynchronous path.
  • The step's callback also sets CamelSlipEndpoint back to the step's endpoint. The nested slip changed it too: an outer dynamic router whose expression reads it after such a step saw the inner slip's last endpoint (mock://inner), not direct://sub. After an empty inner slip it saw no endpoint at all, because a slip removes the property when it starts, so a router written as "first step when CamelSlipEndpoint is null" took its first step again, and again. Without a nested slip the property already had that value, so nothing changes there.

Also not changed: the reason an exception here becomes a hang is in the error handler. RedeliveryErrorHandler.RedeliveryTask.redeliver() calls the output without the try/catch that RedeliveryTask.run() has for the first attempt. So any asynchronous processor that throws from process(exchange, callback) on a redelivery loses the callback (DefaultReactiveExecutor logs and ignores the exception), while the same throw on the first attempt fails the exchange. That affects more than this EIP, so I would rather fix it under its own JIRA.

Tests:

  • New RoutingSlipNestedSlipRedeliveryTest (camel-core, 17 tests, no sleeps). Every send is bounded with assertTimeoutPreemptively (5 s), so a lost callback fails the test instead of blocking the build. The tests cover:
    • a routing slip or dynamic router calling a route with a routing slip or dynamic router, with a doTry at the top of the called route (default error handler, one redelivery) or with noErrorHandler() and a dead letter channel (two redeliveries). The mock in the called route counts the attempts;
    • a handled onException with redelivery;
    • an inner step that completes asynchronously (threads());
    • an inner slip step that the called route's error handler redelivers, before the outer step is redelivered (both producers in use on the same exchange);
    • the route the comparison generated (nested doTry/doFinally, onException with redelivery);
    • the property missing on redelivery: the exchange fails with the new IllegalStateException;
    • three controls that also pass on main: a recipient list in the called route, no redelivery, and no CamelSlipProducer left on the exchange after nested slips;
    • an outer dynamic router that records CamelSlipEndpoint on each evaluation, with a routing slip to mock:inner or an empty routing slip in the called route: it sees none, then direct://sub (bounded to five steps, so the empty case cannot loop forever).
    • 12 of the other tests time out on main ("the send did not complete") and pass with the change. The two CamelSlipEndpoint tests fail without the new line in the callback ([none, mock://inner], and [none, none, none, none, none, none] for the empty inner slip) and pass with it.
  • camel-core: the RoutingSlip, DynamicRouter, redelivery, error handler and dead letter tests (*RoutingSlip*Test, *DynamicRouter*Test, *Redeliver*Test, *ErrorHandler*Test, *DeadLetter*Test): 388 tests, 0 failures, 2 skipped. After the CamelSlipEndpoint change: *RoutingSlip*Test and *DynamicRouter*Test, 91 tests, 0 failures, 2 skipped.
  • The whole camel-core suite, run on the previous base ffab48e with the first version of the test class (14 tests; since then only TokenizerProcessor changed in core): 8332 tests, 45 skipped. 12 of them failed: SimpleSyntaxHintsTest (5), two OGNL hint tests of SimpleTest, FileProducerChecksumOfWrittenFileTest (3), FilePollEnrichDynamicFileNameTest, and ValidatorExternalResourceTest, which downloads an XSD from GitHub and timed out in my offline build. They fail the same way without this change, and none of them uses a routing slip or dynamic router. The other core modules: 1117 tests; the 5 failures (ModelWriterTest, YamlModelWriterTest, the apiDocs default of a rest verb) come from generated writers that my offline build regenerated with an older plugin, and are not in this change. The formatter and import-sort plugins ran and changed nothing.

How it was found: a Rocq specification of Camel's EIPs, written from the documentation, was compared with real Camel on generated routes. One generated route hung. It was minimised, and the lost callback was traced on HotSpot.

Backport candidates, for the maintainers to label if wanted (contributors cannot set port/* labels): camel-4.22.x and camel-4.18.x have the same code, and the hang is reproduced on 4.22.1 and 4.23.0. Apart from CamelSlipEndpoint after a step that ran a nested slip (above), the fix changes nothing that routes see, so it is a backport candidate.

Target

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

Tracking

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

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 the core modules and ran the tests above, including the formatter and import-sort plugins. No generated files change. I did not run the full root build.)

AI-assisted contributions

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

Claude Code on behalf of allthingssecurity

🤖 Generated with Claude Code

…d step no longer hangs after a nested routing slip

The error handler of a routing slip or dynamic router step redelivers through
RoutingSlipProcessor, which reads the step's producer from the exchange property
CamelSlipProducer. A routing slip or dynamic router in the called route runs on the
same exchange: it overwrote that property and removed it when its step completed. The
redelivery then threw a NullPointerException inside the reactive executor, which logs
and ignores it, so the callback was never called and the caller waited forever.

- RoutingSlip.processExchange keeps the producer that was in the property and puts it
  back when the step completes; it removes the property only when there was none.
- RoutingSlipProcessor fails the exchange with an IllegalStateException and calls the
  callback when the property is missing, instead of throwing.
- New RoutingSlipNestedSlipRedeliveryTest (15 tests, every send bounded), also with an inner
  slip step that its own error handler redelivers before the outer step is redelivered.

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

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Good fix for a real deadlock bug in nested RoutingSlip/DynamicRouter scenarios. The root cause is clear: when processExchange is called recursively (nested slips), the inner call overwrites SLIP_PRODUCER on the shared Exchange, leaving the outer call's producer reference as null on redelivery.

The save/restore pattern is correct — Exchange is single-threaded by design, so there is no concurrent access risk. The null guard (callback.done(true); return true) follows the standard Camel synchronous failure pattern. SLIP_ENDPOINT does not need saving because it is unconditionally set at the start of each step regardless.

One minor observation on test robustness — see inline comment.

Missing backport labels: this fix applies to active maintenance branches (camel-4.22.x, camel-4.18.x).

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

@gnodet gnodet added the lts label Oct 31, 2026
@github-actions github-actions Bot added core and removed lts labels Oct 31, 2026
@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.

@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • core/camel-core-processor
  • core/camel-core

ℹ️ 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.

🔁 6 tests passed only after a retry on JDK 21 (6 retried attempts)

Recovered flaky tests on JDK 21 (6)
Module Test Failed attempts First failure
core/camel-core FileConsumerInterceptEmptyFileTest.testExcludeZeroLengthFiles 1 mock://result Received message count. Expected: <2> but was: <1>
core/camel-core FileIdempotentReadSameFileAgainTest.testConsumeSameFileAgain 1 mock://result Message with body Hello World was expected but not found in [, Foo]
core/camel-core DelayerTest.testSendingMessageGetsDelayed 1 mock://result Received message count. Expected: <0> but was: <1>
core/camel-core OnCompletionBridgeErrorHandlerTest.test 1 mock://dead Received message count. Expected: <1> but was: <4>
core/camel-core ThreadsRejectedExecutionTest.testThreadsRejectedAbortNoRedelivery 1 Expected 0 messages at mock:error but got 1 ==> expected: <0> but was: <1>
core/camel-core DistributedOptimisticLockFailingTest.testEverySecondOneFails 1 expected: <25> but was: <11>

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


🔬 Scalpel shadow comparison — Scalpel: 572 of 713 tested, 27 compile-only — current: 573 all tested

Maveniverse Scalpel detected 572 affected modules (current approach: 573).

Skip-tests mode would test 572 modules (2 direct + 570 downstream), skip tests for 27 (generated code, meta-modules)

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

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

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

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

Total reactor time: 9.0s

Module Duration Status
Camel :: Core Processor 9.0s SUCCESS
Camel :: Core n/a

Top 20 slowest modules:

  • Camel :: Core Processor (9.0s)

⚙️ View full build and test results

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

Nice find, and the root cause is right: the first slip step runs on the incoming exchange itself, so a routing slip in a route called through direct overwrites CamelSlipProducer and then removes it, and the outer step's error handler (one RoutingSlipProcessor per slip, the CAMEL-12120 design) has nothing to redeliver to. Restoring the previous producer in the step callback fixes the cause rather than hiding the symptom; fixing only the redelivery path would turn the hang into an NPE and the outer step still could not be redelivered. The guard in RoutingSlipProcessor is a good extra safety net. I traced the async inner step and the copies made for later inner steps, and both carry the restored producer. The tests are bounded and deterministic, with useful controls.

A couple of points:

  1. SLIP_ENDPOINT: since the done() callback in RoutingSlip.processExchange is being rewritten anyway, consider also setting ExchangePropertyKey.SLIP_ENDPOINT back to endpoint.getEndpointUri() there. The routingSlip and dynamicRouter EIP pages document it as the current slip endpoint, and with a nested slip an outer dynamic router expression currently sees the inner slip's last endpoint after the step. It is one line on code this PR already changes.
  2. Please file the follow-up JIRA for RedeliveryErrorHandler.RedeliveryTask.redeliver() missing the try/catch that run() has (the reactiveExecutor.schedule(this::redeliver) paths), and link it from CAMEL-26327. It is the general reason a throwing async processor hangs on redelivery (CAMEL-26301 had the same symptom).
  3. Nit, optional: template.asyncSend(...).get(5, TimeUnit.SECONDS) would bound the send without a preemptive thread switch, but assertTimeoutPreemptively is fine as a safety net.

This looks like a good candidate for camel-4.18.x once merged.


Claude Code on behalf of Claus Ibsen. This review was generated by an AI agent and may contain inaccuracies; please verify all suggestions before applying.

@allthingssecurity

Copy link
Copy Markdown
Contributor Author

@davsclaus thanks for the review. On point 2: the follow-up JIRA for RedeliveryErrorHandler.RedeliveryTask.redeliver() missing the try/catch that run() has (the reactiveExecutor.schedule(this::redeliver) paths, the same hang as CAMEL-26301) is drafted, and I will link it from CAMEL-26327 once it is filed.

Claude Code on behalf of allthingssecurity

… endpoint back to the step after a nested slip

A routing slip or dynamic router in the called route changed CamelSlipEndpoint, so an
outer dynamic router expression saw the inner slip's last endpoint after the step, or
no endpoint at all after an empty inner slip (and took its first step again).

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

Copy link
Copy Markdown
Contributor Author

@davsclaus thanks, point 1 is in f243730: the step callback in RoutingSlip.processExchange sets CamelSlipEndpoint back to the step's endpoint. Two new tests use an outer dynamic router that records the property. With a nested routing slip it used to see mock://inner and now sees direct://sub. With an empty nested slip it saw no endpoint at all, because a slip removes the property when it starts, so the router took its first step again and again; that test bounds it to five steps. Both fail without the line and pass with it. *RoutingSlip*Test and *DynamicRouter*Test: 91 tests, 0 failures. I left point 3 as it is.

Claude Code on behalf of allthingssecurity

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Following up on my earlier review — previous findings are addressed. The assertTimeoutPreemptively concern was a minor observation and the author's defense is valid (it's a safety net for a hang regression, and ContextTestSupport handles cleanup). The new code in f243730 is correct: the unconditional SLIP_ENDPOINT restore in the done() callback (responding to @davsclaus's point 1) fixes dynamic router expressions seeing a stale inner endpoint after a step that called a route with its own routing slip. The two new tests precisely validate this for both the non-empty and empty inner slip cases.

No new issues found. LGTM.


One standing point: backport labels are still missing. This deadlock fix applies to active maintenance branches (camel-4.22.x, camel-4.18.x).

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

@gnodet gnodet added the lts label Oct 31, 2026
@allthingssecurity

Copy link
Copy Markdown
Contributor Author

@davsclaus the follow-up is filed as CAMEL-26430 (RedeliveryTask.redeliver has no try/catch), linked to CAMEL-26327.

Claude Code on behalf of allthingssecurity

@github-actions github-actions Bot removed the lts label Oct 31, 2026

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

TL;DR: Approve. Since my last review the only change is the CamelSlipEndpoint restore in the step callback, with two tests that fail without it. No blockers.

Thanks for picking up point 1 and filing CAMEL-26430. The restore runs before the slip continues (sync and async), so the next dynamic router evaluation sees the step's endpoint, and without a nested slip nothing changes. The empty nested slip case (the router looping on its first step) is a good catch.

  • The assertTimeoutPreemptively thread is answered; it can be resolved.
  • Optional: a one-line upgrade-guide note that CamelSlipEndpoint after a step that ran a nested slip is now the step's endpoint (it matches the EIP docs, so this is a fix).

Claude Code on behalf of Claus Ibsen. This review was generated by an AI agent and may contain inaccuracies; please verify all suggestions before applying.

@davsclaus davsclaus added port/camel-4.22.x Bug needs porting to camel-4.22.x port/camel-4.18.x Bug needs porting to camel-4.18.x labels Oct 31, 2026
@davsclaus davsclaus added this to the 4.24.0 milestone Oct 31, 2026
@davsclaus davsclaus added the bug Something isn't working label Oct 31, 2026
@davsclaus
davsclaus merged commit 2991335 into apache:main Oct 31, 2026
6 checks passed
@gnodet gnodet removed the port/camel-4.22.x Bug needs porting to camel-4.22.x label Oct 31, 2026
@gnodet gnodet removed the port/camel-4.18.x Bug needs porting to camel-4.18.x label Oct 31, 2026
@gnodet

gnodet commented Oct 31, 2026

Copy link
Copy Markdown
Contributor

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants