You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by "allthingssecurity (via GitHub)" <gi...@apache.org> on 2026/09/23 11:29:02 UTC
[PR] CAMEL-24922: camel-core - Sticky failover without round robin should also try the endpoints before the last good one [camel]
allthingssecurity opened a new pull request, #26769:
URL: https://github.com/apache/camel/pull/26769
# Description
[CAMEL-24922](https://issues.apache.org/jira/browse/CAMEL-24922)
With `loadBalance().failover(-1, false, false, true)` (sticky, no round robin), the failover load balancer starts each exchange at the last known good endpoint and only moves forward. At the end of the list it gave up, so the endpoints before the last known good one were never tried again. Once that endpoint went down, every exchange failed, although other endpoints were up and `maximumFailoverAttempts` was `-1`. With `roundRobin=true` the same scenario recovered.
This change: in sticky mode without round robin, when the end of the list is reached, failover continues from the first endpoint and stops once every endpoint has been tried once for the exchange. Sticky with round robin, and non-sticky modes, are unchanged.
Tests: new `FailoverStickyWrapAroundTest`:
- `testFailoverStickyContinuesFromFirstEndpoint`: `c` becomes the last good endpoint; then `c` goes down and `a` comes up. The exchange must fail over from `c` to `a`, and `a` becomes the new last good endpoint.
- `testFailoverStickyTriesEachEndpointOnceWhenAllDown`: with all endpoints down, each is tried exactly once and the exchange fails. There's no endless loop.
Without the fix, both tests fail (`mock://b Received message count. Expected: <1> but was: <0>`). With the fix, they pass together with the existing failover tests (`Failover*Test`, `FailOver*Test`: 21 tests, 0 failures).
Found with a Lean 4 model of `FailOverLoadBalancer` (a proof that sticky mode tries every endpoint failed, which gave this counterexample), then reproduced against the real classes.
# Target
- [x] I checked that the commit is targeting the correct branch (Camel 4 uses the `main` branch)
# Tracking
- [x] If this is a large change, bug fix, or code improvement, I checked there is a [JIRA issue](https://issues.apache.org/jira/browse/CAMEL) filed for the change (usually before you start working on it).
# Apache Camel coding standards and style
- [x] I checked that each commit in the pull request has a meaningful subject line and body.
- [ ] I have run `mvn clean install -DskipTests` locally from root folder and I have committed all auto-generated changes.
(I built and tested the affected modules, `camel-core-processor` and `camel-core`, including the formatter and import-sort plugins. I did not run the full root build.)
# AI-assisted contributions
- [x] 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.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-24922: camel-core - Sticky failover without round robin should also try the endpoints before the last good one [camel]
Posted by "allthingssecurity (via GitHub)" <gi...@apache.org>.
allthingssecurity commented on PR #26769:
URL: https://github.com/apache/camel/pull/26769#issuecomment-5794463775
@oscerd thanks, good catch: with a stale `lastGoodIndex` (for example after processors were removed from a running load balancer) the `index == start` sentinel could never match, and with `maximumFailoverAttempts` -1 the failover kept wrapping around.
Fixed in 3b3a632c with the count-based approach you suggested. `State` now counts the endpoints tried for the exchange. Sticky mode without round robin wraps to the first endpoint only while `tried < processors.length`, and stops once all of them have been tried. `start` is gone, so there's no dependence on it being in range.
New test `testFailoverStickyWhenLastGoodEndpointWasRemoved`:
- `c` becomes the last good endpoint (index 2), then its processor is removed with `removeProcessor`.
- With `a` and `b` down, the exchange must fail within 5 s after trying each of them once.
- With `b` up, it must succeed on `b`.
With the previous sentinel version, the test fails with `TimeoutException` (the loop). With this change, all 4 tests in `FailoverStickyWrapAroundTest` and all 23 `Failover*Test` / `FailOver*Test` tests pass.
Agreed on CI: it still needs a maintainer to approve the workflow runs for this fork PR.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-24922: camel-core - Sticky failover without round robin should also try the endpoints before the last good one [camel]
Posted by "allthingssecurity (via GitHub)" <gi...@apache.org>.
allthingssecurity commented on PR #26769:
URL: https://github.com/apache/camel/pull/26769#issuecomment-5795913427
@oscerd CI is green now, and the count-based termination from your second review is in 3b3a632. Could you take another look when you have time?
_Claude Code on behalf of allthingssecurity_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-24922: camel-core - Sticky failover without round robin should also try the endpoints before the last good one [camel]
Posted by "gnodet-bot (via GitHub)" <gi...@apache.org>.
gnodet-bot commented on code in PR #26769:
URL: https://github.com/apache/camel/pull/26769#discussion_r4081951786
##########
core/camel-core/src/test/java/org/apache/camel/processor/FailoverStickyWrapAroundTest.java:
##########
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.processor;
+
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+/**
+ * Sticky failover (without round robin) must also try the endpoints before the last known good endpoint, once each.
+ */
+public class FailoverStickyWrapAroundTest extends ContextTestSupport {
+
+ private final Set<String> down = ConcurrentHashMap.newKeySet();
+
+ @Test
+ public void testFailoverStickyContinuesFromFirstEndpoint() throws Exception {
+ // a and b are down, so c becomes the last known good endpoint
+ down.add("a");
+ down.add("b");
+ getMockEndpoint("mock:a").expectedMessageCount(1);
+ getMockEndpoint("mock:b").expectedMessageCount(1);
+ getMockEndpoint("mock:c").expectedBodiesReceived("Hello World");
+ template.sendBody("direct:start", "Hello World");
+ assertMockEndpointsSatisfied();
+
+ // now c is down and a and b are up: sticky starts from c, and must then continue from a
+ resetMocks();
+ down.clear();
+ down.add("c");
+ getMockEndpoint("mock:a").expectedBodiesReceived("Bye World");
+ getMockEndpoint("mock:b").expectedMessageCount(0);
+ getMockEndpoint("mock:c").expectedBodiesReceived("Bye World");
+ template.sendBody("direct:start", "Bye World");
+ assertMockEndpointsSatisfied();
+
+ // and a is now the last known good endpoint
+ resetMocks();
+ getMockEndpoint("mock:a").expectedBodiesReceived("Hi World");
+ getMockEndpoint("mock:b").expectedMessageCount(0);
+ getMockEndpoint("mock:c").expectedMessageCount(0);
+ template.sendBody("direct:start", "Hi World");
+ assertMockEndpointsSatisfied();
+ }
+
Review Comment:
⚠️ **Incomplete assertions in the setup phase.**
The first phase of this test (lines 61-64) establishes `lastGoodIndex` for the all-down scenario that follows. It sets `a` and `b` down so `c` becomes the last good endpoint — but it only asserts that `mock:c` received exactly one message. It does NOT assert that `mock:a` and `mock:b` each received exactly one failed attempt before arriving at `c`.
This matters because the all-down scenario in the second phase depends on `lastGoodIndex = 2` (i.e., `c`). If a regression caused the sticky wrap to break silently and the balancer short-circuited to `c` directly without going through `a` and `b`, this setup phase would still pass. Add the missing assertions:
```suggestion
down.add("a");
down.add("b");
getMockEndpoint("mock:a").expectedMessageCount(1);
getMockEndpoint("mock:b").expectedMessageCount(1);
getMockEndpoint("mock:c").expectedMessageCount(1);
template.sendBody("direct:start", "Hello World");
assertMockEndpointsSatisfied();
```
##########
core/camel-core/src/test/java/org/apache/camel/processor/FailoverStickyWrapAroundTest.java:
##########
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.processor;
+
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+/**
+ * Sticky failover (without round robin) must also try the endpoints before the last known good endpoint, once each.
+ */
+public class FailoverStickyWrapAroundTest extends ContextTestSupport {
+
+ private final Set<String> down = ConcurrentHashMap.newKeySet();
+
+ @Test
+ public void testFailoverStickyContinuesFromFirstEndpoint() throws Exception {
+ // a and b are down, so c becomes the last known good endpoint
+ down.add("a");
+ down.add("b");
+ getMockEndpoint("mock:a").expectedMessageCount(1);
+ getMockEndpoint("mock:b").expectedMessageCount(1);
+ getMockEndpoint("mock:c").expectedBodiesReceived("Hello World");
+ template.sendBody("direct:start", "Hello World");
+ assertMockEndpointsSatisfied();
+
+ // now c is down and a and b are up: sticky starts from c, and must then continue from a
+ resetMocks();
+ down.clear();
+ down.add("c");
+ getMockEndpoint("mock:a").expectedBodiesReceived("Bye World");
+ getMockEndpoint("mock:b").expectedMessageCount(0);
+ getMockEndpoint("mock:c").expectedBodiesReceived("Bye World");
+ template.sendBody("direct:start", "Bye World");
+ assertMockEndpointsSatisfied();
+
+ // and a is now the last known good endpoint
+ resetMocks();
+ getMockEndpoint("mock:a").expectedBodiesReceived("Hi World");
+ getMockEndpoint("mock:b").expectedMessageCount(0);
+ getMockEndpoint("mock:c").expectedMessageCount(0);
+ template.sendBody("direct:start", "Hi World");
+ assertMockEndpointsSatisfied();
+ }
+
+ @Test
+ public void testFailoverStickyTriesEachEndpointOnceWhenAllDown() throws Exception {
+ down.add("a");
+ down.add("b");
+ getMockEndpoint("mock:c").expectedMessageCount(1);
+ template.sendBody("direct:start", "Hello World");
+ assertMockEndpointsSatisfied();
+
+ resetMocks();
+ down.add("c");
+ getMockEndpoint("mock:a").expectedMessageCount(1);
+ getMockEndpoint("mock:b").expectedMessageCount(1);
+ getMockEndpoint("mock:c").expectedMessageCount(1);
+ assertThrows(CamelExecutionException.class, () -> template.sendBody("direct:start", "Bye World"));
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:start")
+ .loadBalance().failover(-1, false, false, true)
+ .to("direct:a", "direct:b", "direct:c");
+
+ from("direct:a").to("mock:a").process(e -> failIfDown("a"));
+ from("direct:b").to("mock:b").process(e -> failIfDown("b"));
+ from("direct:c").to("mock:c").process(e -> failIfDown("c"));
+ }
+ };
+ }
+
+ private void failIfDown(String name) {
+ if (down.contains(name)) {
+ throw new IllegalArgumentException(name + " is down");
+ }
+ }
+}
Review Comment:
⚠️ **Missing test: `maximumFailoverAttempts` interaction with sticky wrap-around.**
The production code has two independent exit conditions that can both fire during a sticky wrap-around attempt:
1. The new `index == start` guard (all endpoints tried once)
2. The existing `attempts > maximumFailoverAttempts` guard
There is no test verifying that when `maximumFailoverAttempts` is, say, 1, the balancer stops after 1 attempt even if wrap-around is enabled. Conversely, there is no test verifying that the `attempts` guard fires correctly with wrap-around (i.e., that the attempt counter is incremented for the wrapped endpoints too). Without a test, a subtle ordering bug between the two exit conditions (e.g., wrap fires before the attempts check and resets progress) would go undetected.
Please add a test such as:
```java
@Test
public void testFailoverStickyRespectsMaximumFailoverAttempts() throws Exception {
// a is down; b becomes lastGoodIndex
down.add("a");
template.sendBody("direct:start", "init"); // lastGoodIndex = 1 (b)
// now b is also down; with maximumFailoverAttempts=1 only 1 failover is allowed
// use a route configured with failover(-1 -> 1, false, false, true)
// verify that c is NOT tried (only 1 attempt beyond the starting point)
// ...
}
```
(The exact assertions depend on how the test infrastructure is wired; the point is that the bounded-attempts + wrap-around interaction needs explicit coverage.)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-24922: camel-core - Sticky failover without round robin should also try the endpoints before the last good one [camel]
Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #26769:
URL: https://github.com/apache/camel/pull/26769#issuecomment-5794618982
:star2: Thank you for your contribution to the Apache Camel project! :star2:
:robot: CI automation will test this PR automatically.
:camel: Apache Camel Committers, please review the following items:
* First-time contributors **require MANUAL approval** for the GitHub Actions to run
* You can use the command `/component-test (camel-)component-name1 (camel-)component-name2..` to request a test from the test bot although they are normally detected and executed by CI.
* You can label PRs using `skip-tests` and `test-dependents` to fine-tune the checks executed by this PR.
* Build and test logs are available in the summary page. **Only** [Apache Camel committers](https://camel.apache.org/community/team/#committers) have access to the summary.
:warning: Be careful when sharing logs. Review their contents before sharing them publicly.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-24922: camel-core - Sticky failover without round robin should also try the endpoints before the last good one [camel]
Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #26769:
URL: https://github.com/apache/camel/pull/26769#issuecomment-5795858778
<!-- ci-tested-modules -->
:test_tube: **CI tested the following changed modules:**
- `core/camel-core-processor`
- `core/camel-core`
> :information_source: Dependent modules were not tested because the total number of affected modules exceeded the threshold (50). Use the `test-dependents` label to force testing all dependents.
---
<details><summary>:microscope: Scalpel shadow comparison — Scalpel: 557 of 693 tested, 28 compile-only — current: 558 all tested</summary>
[Maveniverse Scalpel](https://github.com/maveniverse/scalpel) detected **585 affected modules** (current approach: 558).
**Skip-tests mode would test 557 modules** (2 direct + 555 downstream), **skip tests for 28** (generated code, meta-modules)
<details><summary>:warning: Modules only in Scalpel (28)</summary>
- `apache-camel`
- `camel-allcomponents`
- `camel-catalog`
- `camel-catalog-console`
- `camel-catalog-maven`
- `camel-catalog-suggest`
- `camel-componentdsl`
- `camel-endpointdsl`
- `camel-endpointdsl-support`
- `camel-itest`
- `camel-jbang-core`
- `camel-jbang-it`
- `camel-jbang-main`
- `camel-jbang-plugin-edit`
- `camel-jbang-plugin-generate`
- `camel-jbang-plugin-kubernetes`
- `camel-jbang-plugin-test`
- `camel-kamelet-main`
- `camel-launcher`
- `camel-report-maven-plugin`
- `camel-route-parser`
- `camel-salesforce-maven-plugin`
- `camel-yaml-dsl`
- `camel-yaml-dsl-deserializers`
- `camel-yaml-dsl-maven-plugin`
- `coverage`
- `docs`
- `dummy-component`
</details>
<details><summary>Modules only in current approach (1)</summary>
- `camel-test-infra-core`
</details>
<details><summary>Modules Scalpel would test (557)</summary>
- `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-core
- `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/FailoverStickyWrapAroundTest.java
- `camel-core-all` ← downstream of org.apache.camel:camel-core-processor
- `camel-core-engine` ← downstream of org.apache.camel:camel-core-reifier
- `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/loadbalancer/FailOverLoadBalancer.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-health` ← downstream of org.apache.camel:camel-core-engine
- `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-core-engine
- `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-catalog
- `camel-jbang-plugin-mcp` ← downstream of org.apache.camel:camel-jbang-core
- `camel-jbang-plugin-route-parser` ← downstream of org.apache.camel:camel-route-parser
- `camel-jbang-plugin-tui` ← downstream of org.apache.camel:camel-test-junit6
- `camel-jbang-plugin-validate` ← downstream of org.apache.camel:camel-test-junit6
- `camel-jcache` ← downstream of org.apache.camel:camel-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-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-languages
- `camel-management` ← downstream of org.apache.camel:camel-bean
- `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-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-engine
- `camel-openapi-validator` ← 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-openapi-java
- `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-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-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-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-engine
- `camel-xml-io-dsl` ← downstream of org.apache.camel:camel-core-languages
- `camel-xml-jaxb` ← downstream of org.apache.camel:camel-xml-jaxp
- `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-core-languages
- `camel-yaml-dsl-validator-maven-plugin` ← downstream of org.apache.camel:camel-yaml-dsl-validator
- `camel-yaml-io` ← downstream of org.apache.camel:camel-core-engine
- `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
</details>
<details><summary>Modules with tests skipped (28)</summary>
- `apache-camel`
- `camel-allcomponents`
- `camel-catalog`
- `camel-catalog-console`
- `camel-catalog-maven`
- `camel-catalog-suggest`
- `camel-componentdsl`
- `camel-endpointdsl`
- `camel-endpointdsl-support`
- `camel-itest`
- `camel-jbang-core`
- `camel-jbang-it`
- `camel-jbang-main`
- `camel-jbang-plugin-edit`
- `camel-jbang-plugin-generate`
- `camel-jbang-plugin-kubernetes`
- `camel-jbang-plugin-test`
- `camel-kamelet-main`
- `camel-launcher`
- `camel-report-maven-plugin`
- `camel-route-parser`
- `camel-salesforce-maven-plugin`
- `camel-yaml-dsl`
- `camel-yaml-dsl-deserializers`
- `camel-yaml-dsl-maven-plugin`
- `coverage`
- `docs`
- `dummy-component`
</details>
> :information_source: Shadow mode — Scalpel observes but does not affect test execution. [Learn more](https://github.com/maveniverse/scalpel)
</details>
:warning: **Some tests are disabled on GitHub Actions** (`@DisabledIfSystemProperty(named = "ci.env.name")`) and require manual verification:
- `core/camel-core`: 3 test(s) disabled on GitHub Actions
<details><summary>Build reactor — dependencies compiled but only changed modules were tested (2 modules, 9.5s total)</summary>
**Total reactor time:** 9.5s
| Module | Duration | Status |
| --- | --- | --- |
| Camel :: Core Processor | 9.5s | SUCCESS |
| Camel :: Core | n/a | |
**Top 20 slowest modules:**
- `Camel :: Core Processor` (9.5s)
</details>
---
:gear: [View full build and test results](https://github.com/apache/camel/actions/runs/35858219278)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-24922: camel-core - Sticky failover without round robin should also try the endpoints before the last good one [camel]
Posted by "allthingssecurity (via GitHub)" <gi...@apache.org>.
allthingssecurity commented on PR #26769:
URL: https://github.com/apache/camel/pull/26769#issuecomment-5794136273
Thanks for the review. Both points are addressed in 1de2bd2f:
1. The setup phase of `testFailoverStickyTriesEachEndpointOnceWhenAllDown` now also asserts that `a` and `b` each received exactly one (failed) attempt before `c`.
2. New `testFailoverStickyWrapAroundRespectsMaximumFailoverAttempts` uses a route with `failover(2, false, false, true)` over `a, b, c, d`:
- With `a` and `b` down, `c` becomes the last good endpoint.
- With everything down, it tries `c`, then `d`, then wraps to `a`. That uses up the 2 failover attempts, so `b` is not tried and the exchange fails.
- With `a` back up, the exchange succeeds on `a` with the last allowed attempt.
This shows the attempt counter covers the wrapped endpoints: the `attempts > maximumFailoverAttempts` check runs before every move to the next endpoint, including the wrap.
Without the fix, the new test fails (`mock://a Received message count. Expected: <1> but was: <0>`). With it, all 22 `Failover*Test` / `FailOver*Test` tests pass.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-24922: camel-core - Sticky failover without round robin should also try the endpoints before the last good one [camel]
Posted by "apupier (via GitHub)" <gi...@apache.org>.
apupier merged PR #26769:
URL: https://github.com/apache/camel/pull/26769
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org