Skip to content

CAMEL-25823: camel-core - Start Split and Multicast output producers when the route starts - #28147

Open
gnodet wants to merge 5 commits into
apache:mainfrom
gnodet:camel-25823-multicast-split-deferred-start
Open

gnodet wants to merge 5 commits into
apache:mainfrom
gnodet:camel-25823-multicast-split-deferred-start

Conversation

@gnodet

@gnodet gnodet commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Defer error handler startup in MulticastProcessor from doInit() to doStart() to fix compatibility with SupervisingRouteController when a producer cannot connect at context startup.

Splitter extends MulticastProcessor and is fixed by this change as well.

Root Cause

MulticastProcessor.doInit() calls wrapInErrorHandler() for each child processor, which eagerly invoked ServiceHelper.startService(answer) on the wrapped error handler. Starting the error handler starts the wrapped SendProcessor, which in turn starts the underlying Producer (via camelContext.addService(producer, true, true)).

This producer startup happens:

  • During route initialization, before CamelContext is fully started
  • Outside the SupervisingRouteController retry scope

A producer that cannot connect yet (e.g. broker is temporarily down) propagates the exception directly to context.start(), failing the entire context — even though the route was marked for supervision.

Fix

Two changes in MulticastProcessor:

  1. In wrapInErrorHandler(): replaced the unconditional ServiceHelper.startService(answer) with a conditional start gated on isRunAllowed(). isRunAllowed() returns true in STARTING, STARTED, and SUSPENDED states, covering both wrappers built at runtime (e.g. by RecipientListProcessor) and those built during route startup. During doInit() the processor is in INITIALIZING state, so isRunAllowed() is false and the built error handler is cached in errorHandlers but not started. The wrapper is now started before being published to the cache, avoiding a race where a concurrent exchange could take the cache-hit path and use an unstarted wrapper.

  2. In doStart(): added ServiceHelper.startService(errorHandlers.values()) to start any pre-built error handlers that were deferred from doInit(). This runs under the route lifecycle managed by SupervisingRouteController, so failures are caught and the route is scheduled for retry with back-off.

ServiceHelper.start() is idempotent (no-op if already started), so there is no double-start risk when new error handlers are built at runtime and doStart() iterates over errorHandlers.values().

Tests

New test class DefaultSupervisingRouteControllerMulticastSplitTest with two test methods:

  • testSplitWithFlakyProducer() — a split().to("flaky:target") route where the producer fails its first 2 doStart() calls. Asserts context.start() does not throw and the route eventually reaches Started after the supervising controller retries.
  • testMulticastWithFlakyProducer() — same scenario with multicast().to("flaky:target").

Fixes #CAMEL-25823


Hermes Agent (Claude Sonnet 4.6) on behalf of Guillaume Nodet

…ssor from doInit to doStart

MulticastProcessor.doInit() calls wrapInErrorHandler() for each child processor,
which eagerly called ServiceHelper.startService(answer) on the wrapped error handler.
This started the child's SendProcessor (and its producer) before CamelContext was
fully started, outside the SupervisingRouteController retry scope. A producer that
cannot connect yet (e.g. broker is down) would propagate the exception directly to
context.start(), failing the entire context.

Fix: defer the ServiceHelper.startService(answer) call in wrapInErrorHandler to when
the context is already fully started (isStarted()). When wrapInErrorHandler is called
during doInit() (context is STARTING), the built error handler is cached but not started.
doStart() then explicitly starts any pre-cached error handlers via
ServiceHelper.startService(errorHandlers.values()), which runs under the route lifecycle
managed by the SupervisingRouteController.

Split extends MulticastProcessor and is also fixed by this change.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions github-actions Bot added the core label Oct 20, 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 20, 2026 •

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

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

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

🔁 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 FileBeginFailureOneTimeTest.testBeginFailureOneTime 1 mock://result Received message count. Expected: <1> but was: <2>
core/camel-core FileConsumerDeleteAndFailureTest.testMoveFailed 1 mock://result Body of message: 0. Expected: <Hello World IS processed!> but was: < IS processed!>
core/camel-core FileConsumerPreMoveLastModifiedTest.testPreMoveLastModified 1 mock://result Received message count. Expected: <1> but was: <0>
core/camel-core FileConsumerPreMoveNoopTest.testPreMoveNoopSameFileTwice 1 mock://result Body of message: 0. Expected: <Hello Again World> but was: <>
core/camel-core PollEnrichTimeoutFileBodyTest.theVariableIsNullWhenNothingWasPolled 1 Error during type conversion from type: java.lang.String to the required type: java.lang.String due to org.apache.camel.TypeConversionException: Error during type conversion from type: java.io.File to the required type: byte[] due to java.nio.file.NoSuchFileException: /tmp/junit-16818160991837853082/orders-variable/order-1001.json
core/camel-core TotalRequestsThrottlerRateDecreaseTest.testDecreaseWhileExchangesWaitForPermits 1 Condition with Lambda expression in org.apache.camel.processor.throttle.requests.TotalRequestsThrottlerRateDecreaseTest was not fulfilled within 5 seconds.

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


🔬 Scalpel shadow comparison — Scalpel: 567 of 707 tested, 26 compile-only — current: 568 all tested

Maveniverse Scalpel detected 567 affected modules (current approach: 568).

Skip-tests mode would test 567 modules (3 direct + 565 downstream), skip tests for 26 (generated code, meta-modules)

Modules only in current approach (1)
  • camel-test-infra-core
Modules Scalpel would test (567)
  • 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-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-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/impl/engine/DefaultSupervisingRouteControllerMulticastSplitTest.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/MulticastProcessor.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-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-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-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 (26)
  • 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
  • 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 (3 modules, 8.6s total)

Total reactor time: 8.6s

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

Top 20 slowest modules:

  • Camel :: Core Processor (8.6s)

⚙️ View full build and test results

@gnodet
gnodet marked this pull request as ready for review October 21, 2026 11:34

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

TL;DR

Moving the error-handler start to doStart() fixes the reported Split/Multicast symptom. But gating the runtime start on the CamelContext status leaves error handlers built at runtime unstarted. That breaks Recipient List, which did not have the reported bug, while the context is starting or stopping.

Blockers

  • MulticastProcessor.java:1220: the getCamelContext().isStarted() gate also skips the start of error handlers built at runtime.

Other findings: 5 (non-blocking)

Blocker: error handlers built at runtime stay unstarted

isStarted() is true only in Started (BaseService.java:319-321). So it is false in more phases than doInit(), where the context is Initializing. It is also false while the context is Starting: with the default route controller, each route's consumer runs before the next route starts (InternalRouteStartupManager.java:425,465). And it is false while the context is Stopping: in-flight exchanges finish after stop() has set Stopping (BaseService.java:173, AbstractCamelContext.java:3343).

Split and Multicast pre-build their wrappers in doInit(), so the new doStart() loop covers them. RecipientListProcessor, however, is created with route == null (RecipientList.java:218-219) and builds every wrapper at runtime (RecipientListProcessor.java:370). For a recipient first seen in one of those phases, the DefaultErrorHandler clone is never started. Its taskFactory is only created in doStart() (RedeliveryErrorHandler.java:2159-2168), so process() fails the sub-exchange with a NullPointerException (:191, :200-203). The wrapper is also cached (MulticastProcessor.java:1214), and the cache-hit path returns it without starting it (:1200-1203). So that recipient keeps failing until the route restarts. Before this PR the start was unconditional.

What do you think about gating on this processor's own state instead, which stays false until the processor starts?

if (isRunAllowed()) {
    ServiceHelper.startService(answer);
}

A test that sends through a recipientList while the context is still Starting would cover this, for example from an event notifier on that route's RouteStartedEvent.

Other findings

  1. Upgrade guide (non-blocking). Users will notice this change at startup:

    • With the default route controller, context.start() now fails with a FailedToStartRouteException for the route (RouteService.java:126-132) instead of the producer's own exception.
    • These producers now start with their route, in startupOrder, instead of ahead of all routes.
    • With the supervising controller, the producers of an autoStartup=false route are no longer started with the context.

    A short camel-core note in camel-4x-upgrade-guide-4_24.adoc would help, for example after the pollEnrich note.

  2. Tests (suggestion). DefaultSupervisingRouteControllerMulticastSplitTest only checks the route status, so it also passes without the doStart() hunk. Sending a message once the route is Started and checking that the endpoint saw three start attempts would cover the retry path. Comparing with ServiceStatus.Started avoids the toString() comparison.

  3. Follow-up, pre-existing. doStop() and doShutdown() (MulticastProcessor.java:1311,1316) pass the errorHandlers map. ServiceHelper only handles Service and Iterable (ServiceHelper.java:185-191), so for a map it does nothing, and the wrappers started at :1288 are never stopped. Producers are still stopped through processors (SendProcessor.doStop), so nothing leaks. Passing errorHandlers.values() would make the lifecycle symmetric.

  4. Follow-up, pre-existing. Splitter.doInit() (Splitter.java:130-133) still starts the watermark resumeStrategy and loads its cache during route init. A broker-backed strategy that cannot connect yet would fail the context in the same way. This is worth its own Jira.

  5. Title (suggestion). The PR title becomes the squash commit subject and describes the bug, so in the log it reads as the opposite of the change. Something like "start the Split and Multicast outputs when the route starts" would describe the fix.

Checked and fine:

  • The per-output producers are still started by doStart() through processors (:1284).
  • errorHandlers.values() is a snapshot (SimpleLRUCache.java:314-316), and BaseService.start() does nothing when the service is already started (BaseService.java:116-123), so there is no double start.
  • There is no change to ProducerCache or cacheSize.

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

…rs lifecycle, improve test and upgrade guide
@gnodet gnodet changed the title CAMEL-25823: camel-core - Split and Multicast start child producers before CamelContext starts CAMEL-25823: camel-core - Start Split and Multicast output producers when the route starts Oct 21, 2026
@github-actions github-actions Bot added the docs label Oct 21, 2026
@gnodet

gnodet commented Oct 21, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the thorough review @oscerd!

The second commit (4ac39e9) addresses all the actionable findings — it was pushed just as the review came in:

Blocker — isRunAllowed() gate: Replaced getCamelContext().isStarted() with isRunAllowed() as suggested. This correctly handles the RecipientListProcessor case where wrappers are built at runtime during the Starting and Stopping phases.

Finding 3 — errorHandlers lifecycle: Changed doStop() and doShutdown() to pass errorHandlers.values() instead of the map itself, making the lifecycle symmetric.

Finding 2 — test coverage: The test now sends a message after the route reaches Started and verifies the process count. ServiceStatus.Started is used for comparison (not toString).

Finding 1 — upgrade guide: Added to camel-4x-upgrade-guide-4_24.adoc.

Finding 4 — Splitter watermark (pre-existing): Agreed, this is a separate concern. I'll open a dedicated JIRA.

Finding 5 — PR title: The title already says "Start Split and Multicast output producers when the route starts" which describes the fix. Happy to adjust if there is a preferred wording.

CI is running on the updated commit.

@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 the prior review (posted under oscerd) — the second commit addresses most of the raised points.

What's addressed:

  • ✅ Blocker: isRunAllowed() gate replaces getCamelContext().isStarted(). isRunAllowed() returns true in STARTING/STARTED/SUSPENDED states, so error handlers built at runtime during Starting (e.g. RecipientListProcessor) are correctly started immediately. During doInit() (INITIALIZING state), isRunAllowed() is false, so wrappers are deferred to doStart() as intended.
  • ✅ doStop()/doShutdown() now pass errorHandlers.values() — fixes the silent no-op that left error handler wrappers never stopped.
  • ✅ Upgrade guide section added with accurate description of the three behavioral changes.
  • ✅ Tests now assert start attempt counts (assertEquals(3, endpoint.startAttempts.get())) and message processing counts — and use ServiceStatus.Started for the status comparison.
  • ✅ PR title updated to describe the fix, not the bug.

One test bug remains:

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

@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 — all issues have been addressed.

What's fixed in the 3rd commit (0fd6dbe):

  • ✅ Test delimiter bug: template.sendBody("direct:split", "a b c") → "a,b,c" — the space-delimited body produced a singleton under split(body())'s default comma delimiter; the processCount assertion would have always failed.

All prior findings (oscerd + gnodet-bot) are resolved:

  • ✅ isRunAllowed() gate replaces getCamelContext().isStarted() — correctly covers STARTING/STARTED/SUSPENDING/SUSPENDED phases, so error handlers built at runtime by RecipientListProcessor are started immediately, while those built during doInit() (INITIALIZING phase) are deferred to doStart().
  • ✅ doStart() starts pre-built error handlers via ServiceHelper.startService(errorHandlers.values()) — idempotent (no-op if already started).
  • ✅ doStop()/doShutdown() now pass errorHandlers.values() — the prior code passing the Map directly was a silent no-op.
  • ✅ Upgrade guide documents all three behavioral changes accurately.
  • ✅ Test assertions strengthened: startAttempts == 3 validates the retry count, processCount validates end-to-end routing. Both gate correctly on the fix being present.

LGTM.

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

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks Guillaume. Deferring the wrapper start to doStart() is the right fix for the supervising controller, and gating on the processor's own state (isRunAllowed()) addresses Andrea's recipientList concern. I went through the other users of MulticastProcessor: RecipientListProcessor (one instance per RecipientList, started in its doStart()), the SEDA multipleConsumers multicast (started before use) and Splitter (delegates to super). They are fine. Actually stopping the wrappers now (via values()) is safe too: RedeliveryErrorHandler has no doStop() and NoErrorHandler.doStop() is a no-op, so outputs and the shared dead letter processor are not stopped on a route stop, and doStart() starts the wrappers again on restart.

Things to address:

  1. Blocking: the wrapper is now put in the cache before it is started, which opens a race for wrappers built at runtime (see inline).
  2. Lines 1313 and 1318 are over the formatter's 128-character limit, so the build will reformat them and the uncommitted-changes check will fail. Please run mvn formatter:format impsort:sort in core/camel-core-processor.
  3. Two of the upgrade guide bullets do not match what happens (see inline).
  4. The PR description still describes the getCamelContext().isStarted() gate. Please update it to the isRunAllowed() version.

Optional: a test that sends through a recipientList to a recipient not seen before, from a few threads at once, would cover the runtime path that this change touches.

This review was generated by an AI agent (Claude Code on behalf of davsclaus) and may contain inaccuracies. Please verify all suggestions before applying.

Comment thread docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc Outdated
Comment thread docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc Outdated

@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 and davsclaus's review — all issues raised by both have been addressed in the 4th commit.

davsclaus findings resolved:

  • ✅ Cache-before-start race: ServiceHelper.startService(answer) is now called before errorHandlers.putIfAbsent(key, answer), restoring the original guarantee that no concurrent exchange can observe an unstarted wrapper via the cache-hit path. The comment documents this explicitly.
  • ✅ Line length: doStop() and doShutdown() calls are now wrapped across multiple lines (well within the 128-char formatter limit).
  • ✅ Upgrade guide bullet 1 reframed: now focuses on when producers start rather than error behavior, with the init-only context example davsclaus suggested.
  • ✅ Upgrade guide bullet 3: autoStartup=false note now correctly says "regardless of which route controller is used".
  • ✅ PR description updated to describe the isRunAllowed() gate.

Minor nit (non-blocking): The inline comment says isRunAllowed() covers "STARTING/STARTED/SUSPENDED phases" but the actual implementation (status >= STARTING && status <= SUSPENDED) also includes SUSPENDING. The gate behavior is correct; only the comment is slightly incomplete.

LGTM. Solid fix for a tricky lifecycle ordering issue.

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

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

Previous findings are all addressed. The nit I raised in the last review (comment missing SUSPENDING phase) is fixed in commit f783b705.

LGTM.

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

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Re-review of 0fd6dbe..f783b70. Thanks Guillaume, all my points are addressed.

  1. The wrapper is now started before it is put into errorHandlers, in the same order as on main, so the cache-hit path can no longer hand out an unstarted wrapper built at runtime. Wrappers built in doInit() are still cached unstarted and started in doStart(). Two threads that miss the cache for the same new recipient both start a wrapper and one wins putIfAbsent; the other is used for its own exchange and then dropped, which is unchanged from main and harmless, since starting a RedeliveryErrorHandler only builds its task factory.
  2. The doStop()/doShutdown() lines are wrapped within the formatter limit.
  3. The upgrade guide bullets now describe the actual change: the producers start with the route instead of at context initialization, and the autoStartup=false note applies with either route controller.
  4. The PR description now describes the isRunAllowed() gate. Small leftovers, if you touch it again: it omits SUSPENDING from the phases, and it does not mention the errorHandlers.values() stop/shutdown fix or the upgrade-guide entry.

LGTM once CI is green.

This review was generated by an AI agent (Claude Code on behalf of davsclaus) and may contain inaccuracies. Please verify all suggestions before applying.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants