Skip to content

CAMEL-23264: Enhance Splitter EIP with chunking, error threshold, failure tracking, and watermark resume#22300

Merged
gnodet merged 14 commits into
apache:mainfrom
gnodet:CAMEL-23264-splitter-enhancements
Jul 3, 2026
Merged

CAMEL-23264: Enhance Splitter EIP with chunking, error threshold, failure tracking, and watermark resume#22300
gnodet merged 14 commits into
apache:mainfrom
gnodet:CAMEL-23264-splitter-enhancements

Conversation

@gnodet

@gnodet gnodet commented Mar 27, 2026

Copy link
Copy Markdown
Contributor

Summary

Enhances the Splitter EIP with four new features that were previously proposed as a standalone camel-bulk component (CAMEL-23240, PR #22159). After analysis, these features compose naturally with the existing Splitter and benefit from a first-class DSL integration rather than a separate component.

New DSL options

  • group(int) — Chunks split items into List batches of N. Wraps the underlying iterator with GroupIterator. More discoverable than the existing collate(n) Simple expression and works with any split expression.

  • errorThreshold(double) — Aborts when the failure ratio exceeds the threshold (0.0–1.0). For example, errorThreshold(0.5) stops when more than 50% of items fail. Mutually exclusive with stopOnException. Note: with parallelProcessing, the ratio may vary between runs due to non-deterministic callback ordering; prefer maxFailedRecords for deterministic abort behavior in parallel mode.

  • maxFailedRecords(int) — Aborts after N item failures. Mutually exclusive with stopOnException. Can be combined with errorThreshold.

  • SplitResult exchange property — When error thresholds are configured, a structured SplitResult is set as an exchange property (CamelSplitResult) after split completion. Provides totalItems, failureCount, successCount, individual Failure details (index + exception), and an aborted flag.

  • resumeStrategy(ResumeStrategy, key) — Enables resume-from-last-position for split operations using Camel's existing ResumeStrategy SPI:

    • Index-based (default): Automatically skips already-processed items on subsequent runs. After successful completion, stores the last processed index via the ResumeStrategy. Works correctly with group() — tracks raw item indices independently of chunk grouping.
    • Value-based (with watermarkExpression(expr)): The expression (Simple language) is evaluated on each successfully processed sub-exchange as it completes (via ProcessorExchangePair.done() hook). The last evaluated value is stored as the new watermark. The previous watermark is exposed as CamelSplitWatermark exchange property for upstream filtering.
    • Watermark is not updated on abort, allowing retry from the same position.
    • Uses lazy watermark loading — reads from the strategy's ResumeCache on each exchange start, not just on init.
    • Note: Watermark tracking assumes sequential route invocations (batch jobs). Concurrent exchanges on the same route may read the same watermark and process duplicate items.

Usage examples

Chunking — process items in batches of 100

from("direct:start")
    .split(body()).group(100)
    .to("seda:batch-insert"); // each exchange body is a List of up to 100 items

Error threshold — tolerate up to 10% failures

from("direct:start")
    .split(body()).errorThreshold(0.1)
    .process(exchange -> sendToExternalApi(exchange))
    .to("mock:result");
// After split, check the result:
// SplitResult result = exchange.getProperty("CamelSplitResult", SplitResult.class);
// log.info("Processed {}, {} failures", result.getTotalItems(), result.getFailureCount());

Max failed records — stop after 5 failures

from("direct:start")
    .split(body()).maxFailedRecords(5)
    .to("bean:itemProcessor")
    .to("mock:result");

Index-based watermark — resume from last position

// Use any ResumeStrategy implementation — in-memory, database-backed, etc.
ResumeStrategy strategy = ...; // e.g., bound in registry as "myStrategy"

from("timer:batch?period=60000")
    .setBody(method(myDao, "getAllRecords"))  // returns full ordered list
    .split(body()).resumeStrategy(strategy, "myJob")
    .to("bean:processRecord");
// First run:  processes items 0–99, stores watermark "99" via ResumeStrategy
// Second run: skips items 0–99, processes 100+ only

Value-based watermark — track last processed timestamp

ResumeStrategy strategy = ...; // e.g., looked up from registry as "myStrategy"

from("timer:poll?period=60000")
    .setBody(method(myDao, "getRecords"))
    .split(body())
        .resumeStrategy(strategy, "ingest")
        .watermarkExpression("${body.timestamp}")  // evaluated per-item as each completes
    .to("bean:processRecord");
// The watermark expression is evaluated on each successfully processed sub-exchange.
// The last value is stored via ResumeStrategy.updateLastOffset() after split completion.
// The previous watermark is available as ${exchangeProperty.CamelSplitWatermark}
// for upstream filtering on subsequent runs.

Implementation approach

  • Extracted shouldContinueOnFailure() as a protected method in MulticastProcessor, replacing the inline stopOnException check. 100% backward-compatible: all existing EIPs (Multicast, RecipientList) behave identically.
  • Splitter overrides shouldContinueOnFailure() to track failures in a thread-safe SplitFailureTracker (uses AtomicInteger + CopyOnWriteArrayList for parallel mode safety).
  • Value-based watermark evaluates the expression per-item via ProcessorExchangePair.done() hook (thread-safe using AtomicReference.accumulateAndGet with index-based comparison for deterministic results in parallel mode).
  • Watermark tracking uses Camel's ResumeStrategy SPI with OffsetKeys/Offsets for persistence, plus a local ConcurrentHashMap cache for fast reads.
  • Index-based watermark tracks raw item count independently of GroupIterator chunking via a counting decorator, ensuring correct watermark values when group() is used.
  • SplitReifier validates: mutual exclusivity of stopOnException with error thresholds, errorThreshold range (0.0–1.0), maxFailedRecords non-negative, completeness of resumeStrategy/watermarkKey configuration.
  • Reduced cognitive complexity in Splitter.process() and SplitReifier.createProcessor() by extracting helper methods.

Files changed

Module File Change
camel-api SplitResult.java New class with Failure record
camel-api Exchange.java Added SPLIT_RESULT, SPLIT_WATERMARK constants
camel-api ExchangePropertyKey.java Added SPLIT_RESULT, SPLIT_WATERMARK enum entries
camel-core-model SplitDefinition.java Added group, errorThreshold, maxFailedRecords, resumeStrategy, watermarkKey, watermarkExpression fields + fluent methods with javadoc on parallel limitations
camel-core-processor MulticastProcessor.java Extracted shouldContinueOnFailure() method
camel-core-processor Splitter.java Added group/error threshold/SplitResult/watermark implementation using ResumeStrategy, raw item counting for group+watermark correctness, extracted helper methods for reduced complexity
camel-core-reifier SplitReifier.java Wiring + validation for ResumeStrategy lookup, error threshold range, config completeness; extracted configureErrorThreshold() and configureWatermark()
camel-yaml-dsl ModelDeserializers.java, camelYamlDsl.json Regenerated
docs split-eip.adoc Full documentation: chunking, error handling, SplitResult, watermark tracking with Java/XML/YAML examples, parallel/concurrency notes
docs camel-4x-upgrade-guide-4_19.adoc New features section for Split EIP enhancements

Test plan

  • SplitterGroupTest — 5 tests: group=3 with 7 items, exact multiple, single item, parallel processing, group+maxFailedRecords
  • SplitterMaxFailedRecordsTest — 5 tests: stops after threshold, all succeed, single failure (below threshold), mutual exclusivity with stopOnException, parallel processing
  • SplitterErrorThresholdTest — 10 tests: stops when ratio exceeded, below ratio continues, all succeed, mutual exclusivity with stopOnException, parallel processing, combined thresholds, empty input, exact boundary, just-below boundary, maxFailedRecords exact boundary
  • SplitterSplitResultTest — 11 tests: result with failures, result when aborted, all success, streaming mode, parallel mode, no result without threshold, toString() format, toString() aborted, null failures constructor, empty input, Failure record
  • SplitterWatermarkTest — 15 tests: index-based first/second run, no update on abort, value-based per-item/with previous, parallel value/index, group+watermark first/second run, null expression result, all items fail, combined errorThreshold+watermark, empty input, single item, value no-update-on-abort
  • SplitterTransactedTest — 6 tests: all new features via the MulticastTransactedTask code path
  • SplitterStreamingTest — 6 tests: streaming SplitResult total items, streaming abort, streaming grouping, streaming watermark first/second run, streaming+parallel+maxFailedRecords
  • SplitterParallelErrorThresholdTest — 3 tests: parallel+maxFailedRecords abort, parallel all succeed, parallel+errorThreshold high failure rate
  • SplitterValidationTest — 6 tests: errorThreshold negative/above-1 rejected, maxFailedRecords negative rejected, watermarkKey without resumeStrategy rejected, resumeStrategy without key rejected, watermarkExpression without resumeStrategy rejected
  • All 67 Splitter enhancement tests pass (0 failures, 0 skipped)

Supersedes #22159 (camel-bulk component, closed).

JIRA: https://issues.apache.org/jira/browse/CAMEL-23264

@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 build-all, build-dependents, 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.

@gnodet gnodet marked this pull request as draft March 27, 2026 19:22
@gnodet gnodet changed the title CAMEL-23264: Enhance Splitter EIP with chunking, error threshold, and failure tracking CAMEL-23264: Enhance Splitter EIP with chunking, error threshold, failure tracking, and watermark resume Mar 28, 2026
@github-actions github-actions Bot added the docs label Mar 28, 2026
@gnodet gnodet marked this pull request as ready for review March 30, 2026 05:31
@sonarqubecloud

sonarqubecloud Bot commented Apr 6, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
0.0% Coverage on New Code (required ≥ 80%)

See analysis details on SonarQube Cloud


Removed 2 deprecated methods in Java DSL for `throttler` EIP.

==== Split EIP enhancements

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.

The upgrade guide should only contain information for end users that upgrade existing Camel apps - since all of this is new functionality then this is not relevant here and should be removed

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done — removed the entire Split EIP section from the upgrade guide.

Claude Code on behalf of Guillaume Nodet

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

This is some advanced features so its good they are marked as such.

Note that group is already there as a simple language function, but it can be easier to set group=10 on the EIP and its more tooling friendly.

@apupier

apupier commented Apr 21, 2026

Copy link
Copy Markdown
Contributor

@gnodet What is the status of this PR?

I think there was some work in progress related to sonar when this was created. I guess the sonarcloud check which si failing will vanish after a rebase.

@oscerd you were asked as reviewer

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

This is a strong, well-tested enhancement to the Splitter EIP, and I like that the new behavior is strictly opt-in (all new fields default to inactive, so existing routes are unaffected). The model → reifier → processor wiring and the generated files all look consistent. A few items:

  • The upgrade-guide entry for the Split EIP enhancements was added to camel-4x-upgrade-guide-4_19.adoc, but this ships in 4.21 — it should move to camel-4x-upgrade-guide-4_21.adoc so users upgrading to 4.21 actually find it.
  • The new public SplitResult class in core/camel-api is missing a @since 4.21 tag (the project requires @since on new camel-api public types; the nested Failure record and the public accessors are new surface too).
  • The SonarCloud Code Analysis check is red — worth opening the report to confirm it's coverage/cognitive-complexity rather than a flagged smell, especially since the PR set out to reduce complexity.
  • Just to confirm the intended contract: when errorThreshold/maxFailedRecords is set, per-item exceptions are cleared from sub-exchanges (so a custom AggregationStrategy won't see them; failures surface via SplitResult). It's documented — calling it out so it's a deliberate choice.

Really nice work overall.


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

@davsclaus

Copy link
Copy Markdown
Contributor

@gnodet can you rebase this on main - would be good to get this ready for 4.21 and it benefits camel end users and also the AI use-cases that comes

@gnodet gnodet force-pushed the CAMEL-23264-splitter-enhancements branch from 0c83e16 to 5274c1f Compare July 2, 2026 11:35
@gnodet

gnodet commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto latest main and addressed review feedback:

  1. Removed upgrade guide section (per @davsclaus): The Split EIP enhancements section has been removed from camel-4x-upgrade-guide-4_19.adoc — since all features are new, there's nothing for existing users to migrate.

  2. Added @since 4.21 tags (per @oscerd): Added @since 4.21 Javadoc tags to the SplitResult class and its nested Failure record in core/camel-api.

  3. Regenerated all downstream artifacts after rebase to resolve conflicts in generated files (ExchangeConstantProvider, split.json, ModelDeserializers, XSD schemas, YamlModelWriter).

All 67 Splitter enhancement tests pass ✅

Claude Code on behalf of Guillaume Nodet

@gnodet gnodet requested review from davsclaus and oscerd July 2, 2026 11:35
@davsclaus

Copy link
Copy Markdown
Contributor

this should be since 4.22

@gnodet

gnodet commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

@davsclaus Thanks for the review and approval! Good point about group already existing as a Simple language function (collate(n)). The DSL-level group(int) option is indeed more discoverable and tooling-friendly — it works with any split expression and doesn't require knowledge of the Simple language.

Claude Code on behalf of Guillaume Nodet

@gnodet

gnodet commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

@oscerd Thanks for the thorough review! Addressing each item:

  • Upgrade guide location: Removed entirely per @davsclaus's feedback — since these are all new features, there's nothing for existing users to migrate. The features are fully documented in the split-eip.adoc page.

  • @since 4.21 tag: Added @since 4.21 to both the SplitResult class and the nested Failure record.

  • SonarCloud: The branch has been rebased and all artifacts regenerated. CI is running on the new changeset — will monitor.

  • Exception clearing contract: Confirmed — this is intentional. When errorThreshold/maxFailedRecords is configured, per-item exceptions are cleared from sub-exchanges after being recorded in the SplitFailureTracker. Failures are surfaced via the SplitResult exchange property. This is documented in the split-eip.adoc page and in the Javadoc on shouldContinueOnFailure().

Claude Code on behalf of Guillaume Nodet

@davsclaus

Copy link
Copy Markdown
Contributor

@gnodet camel 4.21 has already been released, this code will go into the next release 4.22.0

Copilot AI 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.

Pull request overview

This PR enhances Camel’s core Splitter EIP with first-class support for chunking (group), failure-tolerant processing (errorThreshold, maxFailedRecords) with structured outcome reporting (SplitResult exchange property), and resume/watermark tracking based on Camel’s existing ResumeStrategy SPI. The change spans core processor behavior, model/reifier wiring, YAML/XML IO/schema generation, documentation, and extensive new unit tests.

Changes:

  • Add new Splitter DSL/model options for chunking, error thresholds, and resume/watermark configuration (Java/XML/YAML).
  • Implement failure tracking + abort policies and persist a SplitResult exchange property when thresholds are enabled.
  • Implement index-based and value-based watermark persistence/restore via ResumeStrategy, plus docs and tests covering streaming/parallel/transacted paths.

Reviewed changes

Copilot reviewed 18 out of 28 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json YAML DSL schema updates for new Split options.
dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java YAML deserializer wiring for new SplitDefinition fields.
core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/YamlModelWriter.java YAML writer emits new SplitDefinition attributes.
core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java XML writer emits new SplitDefinition attributes.
core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java XML parser reads new SplitDefinition attributes.
core/camel-core/src/test/java/org/apache/camel/processor/SplitterWatermarkTest.java Tests for index/value watermark behavior, including group + parallel scenarios.
core/camel-core/src/test/java/org/apache/camel/processor/SplitterValidationTest.java Validation tests for threshold ranges and resume/watermark config completeness.
core/camel-core/src/test/java/org/apache/camel/processor/SplitterTransactedTest.java Coverage for new features via the transacted Multicast code path.
core/camel-core/src/test/java/org/apache/camel/processor/SplitterTestResumeStrategy.java Test ResumeStrategy implementation used by watermark-related tests.
core/camel-core/src/test/java/org/apache/camel/processor/SplitterStreamingTest.java Coverage for streaming mode interactions with thresholds/grouping/watermark.
core/camel-core/src/test/java/org/apache/camel/processor/SplitterSplitResultTest.java Tests for SplitResult contents and presence/absence rules.
core/camel-core/src/test/java/org/apache/camel/processor/SplitterParallelErrorThresholdTest.java Parallel-mode behavior tests for abort thresholds.
core/camel-core/src/test/java/org/apache/camel/processor/SplitterMaxFailedRecordsTest.java Functional tests for max-failed abort logic and exclusivity constraints.
core/camel-core/src/test/java/org/apache/camel/processor/SplitterGroupTest.java Functional tests for chunking/grouping (including with failures).
core/camel-core/src/test/java/org/apache/camel/processor/SplitterErrorThresholdTest.java Functional tests for ratio-based threshold behavior and boundaries.
core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SplitReifier.java Model-to-processor wiring and validation for new Split options.
core/camel-core-processor/src/main/java/org/apache/camel/processor/Splitter.java Core implementation for grouping, threshold aborts, SplitResult, and watermark tracking.
core/camel-core-processor/src/main/java/org/apache/camel/processor/MulticastProcessor.java Extract shouldContinueOnFailure hook to allow Splitter-specific failure policy.
core/camel-core-model/src/main/java/org/apache/camel/model/SplitDefinition.java New model fields + fluent DSL methods for group/threshold/watermark/resumeStrategy.
core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/split.json Regenerated model metadata for new SplitDefinition attributes and exchange properties.
core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc Documentation for chunking, error thresholds, SplitResult, and watermark usage/caveats.
core/camel-api/src/main/java/org/apache/camel/SplitResult.java New public API type representing structured Splitter outcomes.
core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java Adds typed exchange-property key support for the new SplitResult property.
core/camel-api/src/main/java/org/apache/camel/Exchange.java Adds SPLIT_RESULT and SPLIT_WATERMARK exchange property constants.
core/camel-api/src/generated/java/org/apache/camel/ExchangeConstantProvider.java Regenerated constant provider entries for new exchange property constants.
catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-xml-io.xsd Regenerated XML schema reflecting new SplitDefinition attributes.
catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd Regenerated Spring XML schema reflecting new SplitDefinition attributes.
catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/split.json Regenerated catalog model metadata for new SplitDefinition options.
Comments suppressed due to low confidence (1)

core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java:232

  • After adding SPLIT_WATERMARK to ExchangePropertyKey, it also needs to be handled in asExchangePropertyKey(String); otherwise typed lookups won’t resolve this new key.
            case Exchange.SPLIT_SIZE:
                return SPLIT_SIZE;
            case Exchange.STEP_ID:
                return STEP_ID;
            case Exchange.STREAM_CACHE_UNIT_OF_WORK:

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +83 to +86
int group = parseInt(definition.getGroup(), 0);
if (group > 0) {
answer.setGroup(group);
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Good catch — added validation to reject negative group values with IllegalArgumentException in SplitReifier.

Claude Code on behalf of Guillaume Nodet

Comment on lines +94 to +117
private void configureErrorThreshold(Splitter answer, boolean isStopOnException) {
String etStr = parseString(definition.getErrorThreshold());
double errorThreshold = etStr != null ? Double.parseDouble(etStr) : 0;
int maxFailedRecords = parseInt(definition.getMaxFailedRecords(), 0);
boolean hasErrorThreshold = errorThreshold > 0 || maxFailedRecords > 0;
if (hasErrorThreshold && isStopOnException) {
throw new IllegalArgumentException(
"Cannot use both stopOnException and errorThreshold/maxFailedRecords on the Splitter EIP");
}
if (errorThreshold != 0 && (errorThreshold < 0 || errorThreshold > 1.0)) {
throw new IllegalArgumentException(
"errorThreshold must be between 0.0 and 1.0, but was: " + errorThreshold);
}
if (maxFailedRecords < 0) {
throw new IllegalArgumentException(
"maxFailedRecords must not be negative, but was: " + maxFailedRecords);
}
if (errorThreshold > 0) {
answer.setErrorThreshold(errorThreshold);
}
if (maxFailedRecords > 0) {
answer.setMaxFailedRecords(maxFailedRecords);
}
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This is intentional. errorThreshold(0.0) means "tolerate zero failures" which is semantically identical to stopOnException(true). The > 0 check correctly treats 0.0 as "not configured" since users wanting that behavior should use stopOnException or maxFailedRecords(1) instead. The validation at line 103 allows 0.0 to pass without error (rather than throwing) because setting errorThreshold(0.0) is a no-op, not a misconfiguration worth rejecting.

Claude Code on behalf of Guillaume Nodet

Comment on lines +217 to +221
private boolean setupFailureTracking(Exchange exchange) {
boolean hasErrorThreshold = errorThreshold > 0 || maxFailedRecords > 0;
if (hasErrorThreshold) {
exchange.setProperty(SPLIT_FAILURE_TRACKER, new SplitFailureTracker());
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Same rationale as above — errorThreshold > 0 is intentional. errorThreshold(0.0) is a no-op (same as not setting it), since "tolerate zero failures" is what stopOnException is for. The > 0 check is consistent between SplitReifier (wiring) and Splitter (runtime).

Claude Code on behalf of Guillaume Nodet

Comment on lines +672 to +675
// don't update watermark if processing was aborted (allows retry)
if (exchange.getException() != null) {
return;
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Good catch — fixed. Moved the cleanup of internal properties (SPLIT_WATERMARK_OFFSET, SPLIT_WATERMARK_COUNT, SPLIT_WATERMARK_LATEST) into a finally block so they are always removed, even on abort. The watermark value itself is still not persisted on abort (intentional — allows retry from the same position).

Claude Code on behalf of Guillaume Nodet

Comment on lines +984 to +986
/**
* Sets a Simple expression to evaluate on the exchange after split completion to determine the new watermark value.
*/

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Good catch — fixed. Updated the javadoc to: "Sets a Simple expression to evaluate on each completed sub-exchange to determine the new watermark value. When set, enables value-based watermarking instead of index-based."

This matches the actual implementation which evaluates the expression per-item via ProcessorExchangePair.done() and persists only the last value.

Claude Code on behalf of Guillaume Nodet

Comment on lines 89 to 93
SPLIT_COMPLETE(Exchange.SPLIT_COMPLETE),
SPLIT_INDEX(Exchange.SPLIT_INDEX),
SPLIT_RESULT(Exchange.SPLIT_RESULT),
SPLIT_SIZE(Exchange.SPLIT_SIZE),
STEP_ID(Exchange.STEP_ID),

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done — added SPLIT_WATERMARK(Exchange.SPLIT_WATERMARK) to the enum and the corresponding case in asExchangePropertyKey(). Same fix as requested by @davsclaus.

Claude Code on behalf of Guillaume Nodet

@davsclaus

Copy link
Copy Markdown
Contributor

rebase on main

@davsclaus davsclaus force-pushed the CAMEL-23264-splitter-enhancements branch from 47440bf to 630d2a1 Compare July 2, 2026 17:51
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • catalog/camel-catalog
  • core/camel-api
  • core/camel-core-engine
  • core/camel-core-model
  • core/camel-core-processor
  • core/camel-core-reifier
  • core/camel-core
  • core/camel-java-io
  • core/camel-xml-io
  • core/camel-yaml-io
  • dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers
  • dsl/camel-yaml-dsl/camel-yaml-dsl

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


🔬 Scalpel shadow comparison — Scalpel: 555 tested, 26 compile-only — current: 552 all tested

Maveniverse Scalpel detected 581 affected modules (current approach: 552).

⚠️ Modules only in Scalpel (29)
  • apache-camel
  • camel-allcomponents
  • camel-catalog
  • camel-catalog-console
  • camel-catalog-lucene
  • camel-catalog-maven
  • camel-catalog-suggest
  • camel-componentdsl
  • camel-csimple-maven-plugin
  • camel-endpointdsl
  • camel-endpointdsl-support
  • camel-itest
  • camel-jbang-core
  • camel-jbang-it
  • camel-jbang-main
  • camel-jbang-plugin-edit
  • camel-jbang-plugin-generate
  • camel-jbang-plugin-kubernetes
  • camel-jbang-plugin-test
  • camel-kamelet-main
  • camel-launcher
  • camel-report-maven-plugin
  • camel-route-parser
  • camel-yaml-dsl
  • camel-yaml-dsl-deserializers
  • camel-yaml-dsl-maven-plugin
  • coverage
  • docs
  • dummy-component

Skip-tests mode would test 555 modules (12 direct + 543 downstream), skip tests for 26 (generated code, meta-modules)

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

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

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

  • core/camel-core: 2 test(s) disabled on GitHub Actions
Build reactor — dependencies compiled but only changed modules were tested (580 modules)
  • Camel :: AI :: A2A
  • Camel :: AI :: ChatScript
  • Camel :: AI :: Deep Java Library
  • Camel :: AI :: Docling
  • Camel :: AI :: Hugging Face
  • Camel :: AI :: KServe
  • Camel :: AI :: LangChain4j :: Agent
  • Camel :: AI :: LangChain4j :: Agent :: API
  • Camel :: AI :: LangChain4j :: Chat
  • Camel :: AI :: LangChain4j :: Core
  • Camel :: AI :: LangChain4j :: Embedding
  • Camel :: AI :: LangChain4j :: Embedding Store :: API
  • Camel :: AI :: LangChain4j :: EmbeddingStore
  • Camel :: AI :: LangChain4j :: Tokenizer
  • Camel :: AI :: LangChain4j :: Tools
  • Camel :: AI :: LangChain4j :: Web Search
  • Camel :: AI :: Milvus
  • Camel :: AI :: Neo4j
  • Camel :: AI :: OpenAI
  • Camel :: AI :: PGVector
  • Camel :: AI :: Parent
  • Camel :: AI :: Pinecone
  • Camel :: AI :: Qdrant
  • Camel :: AI :: TensorFlow Serving
  • Camel :: AI :: Weaviate
  • Camel :: AMQP
  • Camel :: API
  • Camel :: AS2 :: API
  • Camel :: AS2 :: Component
  • Camel :: AS2 :: Parent
  • Camel :: ASN.1
  • Camel :: AWS :: Common
  • Camel :: AWS :: Parent
  • Camel :: AWS Cloutrail
  • Camel :: AWS Config
  • Camel :: AWS Redshift Data
  • Camel :: AWS Rekognition
  • Camel :: AWS Security Hub
  • Camel :: AWS Step Functions
  • Camel :: AWS Timestream
  • Camel :: AWS2 :: Transcribe
  • Camel :: AWS2 Athena
  • Camel :: AWS2 Bedrock
  • Camel :: AWS2 CW
  • Camel :: AWS2 Comprehend
  • Camel :: AWS2 DDB
  • Camel :: AWS2 EC2
  • Camel :: AWS2 ECS
  • Camel :: AWS2 EKS
  • Camel :: AWS2 Eventbridge
  • Camel :: AWS2 IAM
  • Camel :: AWS2 KMS
  • Camel :: AWS2 Kinesis
  • Camel :: AWS2 Lambda
  • Camel :: AWS2 MQ
  • Camel :: AWS2 MSK
  • Camel :: AWS2 Parameter Store
  • Camel :: AWS2 Polly
  • Camel :: AWS2 S3
  • Camel :: AWS2 S3 Vectors
  • Camel :: AWS2 SES
  • Camel :: AWS2 SNS
  • Camel :: AWS2 SQS
  • Camel :: AWS2 STS
  • Camel :: AWS2 Secrets Manager
  • Camel :: AWS2 Textract
  • Camel :: AWS2 Translate
  • Camel :: ActiveMQ 5.x
  • Camel :: ActiveMQ 6.x
  • Camel :: All Components Sync point
  • Camel :: All Core Sync point
  • Camel :: ArangoDB
  • Camel :: Archetypes
  • Camel :: Archetypes :: API Component
  • Camel :: Archetypes :: Component
  • Camel :: Archetypes :: Data Format
  • Camel :: Archetypes :: Java Router
  • Camel :: Archetypes :: Main
  • Camel :: Archetypes :: Spring XML Based Router (deprecated)
  • Camel :: Assembly
  • Camel :: Asterisk
  • Camel :: Atmosphere WebSocket Servlet
  • Camel :: Atom
  • Camel :: Attachments
  • Camel :: Avro
  • Camel :: Avro RPC
  • Camel :: Avro RPC :: Jetty
  • Camel :: Avro RPC :: Parent
  • Camel :: Avro RPC :: Spi
  • Camel :: Azure :: Common
  • Camel :: Azure :: CosmosDB
  • Camel :: Azure :: Event Grid
  • Camel :: Azure :: Event Hubs
  • Camel :: Azure :: Files
  • Camel :: Azure :: Functions
  • Camel :: Azure :: Key Vault
  • Camel :: Azure :: Parent
  • Camel :: Azure :: Schema Registry
  • Camel :: Azure :: ServiceBus
  • Camel :: Azure :: Storage Blob
  • Camel :: Azure :: Storage Datalake
  • Camel :: Azure :: Storage Queue
  • Camel :: Barcode
  • Camel :: Base
  • Camel :: Base Engine
  • Camel :: Base64
  • Camel :: Bean
  • Camel :: Bean validator
  • Camel :: BeanIO
  • Camel :: Bindy
  • Camel :: Bonita
  • Camel :: Box :: API
  • Camel :: Box :: Component
  • Camel :: Box :: Parent
  • Camel :: Braintree
  • Camel :: Browse
  • Camel :: CBOR
  • Camel :: CM SMS
  • Camel :: CSV
  • Camel :: CXF :: Common
  • Camel :: CXF :: Common :: Spring
  • Camel :: CXF :: Parent
  • Camel :: CXF :: REST
  • Camel :: CXF :: REST :: Spring
  • Camel :: CXF :: SOAP
  • Camel :: CXF :: SOAP :: Spring
  • Camel :: CXF :: Transport
  • Camel :: CXF :: Transport :: Spring
  • Camel :: Caffeine
  • Camel :: Camunda
  • Camel :: Cassandra CQL
  • Camel :: Catalog :: CSimple Maven Plugin (deprecated)
  • Camel :: Catalog :: Camel Catalog
  • Camel :: Catalog :: Camel Report Maven Plugin
  • Camel :: Catalog :: Camel Route Parser
  • Camel :: Catalog :: Common
  • Camel :: Catalog :: Console
  • Camel :: Catalog :: Dummy Component
  • Camel :: Catalog :: Lucene (deprecated)
  • Camel :: Catalog :: Maven
  • Camel :: Catalog :: Suggest
  • Camel :: Chunk
  • Camel :: ClickUp
  • Camel :: CloudEvents
  • Camel :: Cluster
  • Camel :: CoAP
  • Camel :: Cometd
  • Camel :: Common Telemetry
  • Camel :: Common Tracing (deprecated)
  • Camel :: Component DSL
  • Camel :: Components
  • Camel :: Console
  • Camel :: Consul
  • Camel :: Controlbus
  • Camel :: Core
  • Camel :: Core Catalog
  • Camel :: Core Engine
  • Camel :: Core Languages
  • Camel :: Core Model
  • Camel :: Core Processor
  • Camel :: Core Reifier
  • Camel :: Core XML
  • Camel :: CouchDB
  • Camel :: Couchbase
  • Camel :: Coverage
  • Camel :: Cron
  • Camel :: Crypto
  • Camel :: Crypto PGP
  • Camel :: CyberArk Vault
  • Camel :: DFDL
  • Camel :: DHIS2
  • Camel :: DHIS2 :: Parent
  • Camel :: DHIS2 API
  • Camel :: DNS
  • Camel :: DSL :: CLI Connector
  • Camel :: DSL :: CLI Debug
  • Camel :: DSL :: Modeline
  • Camel :: DSL :: Support
  • Camel :: Dapr
  • Camel :: DataSet
  • Camel :: DataSonnet
  • Camel :: Dataformat
  • Camel :: Debezium :: Common
  • Camel :: Debezium :: Common :: Parent
  • Camel :: Debezium :: DB2
  • Camel :: Debezium :: Maven Plugin
  • Camel :: Debezium :: MongoDB
  • Camel :: Debezium :: MySQL
  • Camel :: Debezium :: Oracle
  • Camel :: Debezium :: Parent
  • Camel :: Debezium :: PostgreSQL
  • Camel :: Debezium :: SQL Server
  • Camel :: Debugging
  • Camel :: Diagram
  • Camel :: DigitalOcean (deprecated)
  • Camel :: Direct
  • Camel :: Disruptor
  • Camel :: Docker
  • Camel :: Docs
  • Camel :: Drill
  • Camel :: Dropbox
  • Camel :: Dynamic Router
  • Camel :: Ehcache
  • Camel :: ElasticSearch Java API Client
  • Camel :: ElasticSearch Rest Client
  • Camel :: Endpoint DSL
  • Camel :: Endpoint DSL :: Support
  • Camel :: Event
  • Camel :: Exec
  • Camel :: FHIR
  • Camel :: FHIR :: API
  • Camel :: FHIR :: Parent
  • Camel :: FOP
  • Camel :: FTP
  • Camel :: FTP Common
  • Camel :: Fastjson
  • Camel :: File
  • Camel :: File Watch
  • Camel :: FlatPack
  • Camel :: Flink
  • Camel :: Flowable
  • Camel :: Fory
  • Camel :: Freemarker
  • Camel :: Geocoder
  • Camel :: Git
  • Camel :: GitHub2
  • Camel :: Google :: BigQuery
  • Camel :: Google :: Calendar
  • Camel :: Google :: Common
  • Camel :: Google :: Drive
  • Camel :: Google :: Firestore
  • Camel :: Google :: Functions
  • Camel :: Google :: Mail
  • Camel :: Google :: Parent
  • Camel :: Google :: PubSub
  • Camel :: Google :: Secret Manager
  • Camel :: Google :: Sheets
  • Camel :: Google :: Speech To Text
  • Camel :: Google :: Storage
  • Camel :: Google :: Text To Speech
  • Camel :: Google :: Vertex AI
  • Camel :: Google :: Vision
  • Camel :: GraphQL
  • Camel :: Grok
  • Camel :: Groovy
  • Camel :: Gson
  • Camel :: HL7
  • Camel :: HTTP
  • Camel :: HTTP :: Base
  • Camel :: HTTP :: Common
  • Camel :: Hashicorp :: Key Vault
  • Camel :: HazelCast
  • Camel :: Headers Map (deprecated)
  • Camel :: Health
  • Camel :: Huawei Cloud :: Common
  • Camel :: Huawei Cloud :: DMS
  • Camel :: Huawei Cloud :: FaceRecognition
  • Camel :: Huawei Cloud :: FunctionGraph
  • Camel :: Huawei Cloud :: IAM
  • Camel :: Huawei Cloud :: ImageRecognition
  • Camel :: Huawei Cloud :: OBS
  • Camel :: Huawei Cloud :: Parent
  • Camel :: Huawei Cloud :: SimpleNotification
  • Camel :: IBM :: Cloud Object Storage
  • Camel :: IBM :: Parent
  • Camel :: IBM :: Secrets Manager
  • Camel :: IBM :: Watson Discovery
  • Camel :: IBM :: Watson Language
  • Camel :: IBM :: Watson Speech to Text
  • Camel :: IBM :: Watson Text to Speech
  • Camel :: IBM :: watsonx.ai
  • Camel :: IBM :: watsonx.data
  • Camel :: IEC 60870 (deprecated)
  • Camel :: IRC (deprecated)
  • Camel :: ISO-8583
  • Camel :: Iggy
  • Camel :: Ignite
  • Camel :: Infinispan :: Common
  • Camel :: Infinispan :: Embedded
  • Camel :: Infinispan :: Parent
  • Camel :: Infinispan :: Remote
  • Camel :: InfluxDB
  • Camel :: InfluxDB2
  • Camel :: Integration Tests
  • Camel :: Integration Tests :: Stream Caching Tests
  • Camel :: IronMQ
  • Camel :: JAXB
  • Camel :: JBang :: Console
  • Camel :: JBang :: Core
  • Camel :: JBang :: Integration tests
  • Camel :: JBang :: MCP
  • Camel :: JBang :: Main
  • Camel :: JBang :: Plugin :: Edit
  • Camel :: JBang :: Plugin :: Generate
  • Camel :: JBang :: Plugin :: Kubernetes
  • Camel :: JBang :: Plugin :: MCP
  • Camel :: JBang :: Plugin :: Route Parser
  • Camel :: JBang :: Plugin :: TUI
  • Camel :: JBang :: Plugin :: Testing
  • Camel :: JBang :: Plugin :: Validate
  • Camel :: JCR
  • Camel :: JCache
  • Camel :: JDBC
  • Camel :: JGroups
  • Camel :: JGroups Raft
  • Camel :: JIRA
  • Camel :: JMS
  • Camel :: JMX
  • Camel :: JOOQ
  • Camel :: JPA
  • Camel :: JQ
  • Camel :: JSON validator
  • Camel :: JSON-B
  • Camel :: JSONATA
  • Camel :: JSon Path
  • Camel :: JSonApi
  • Camel :: JSoup
  • Camel :: JTA
  • Camel :: Jackson
  • Camel :: Jackson 3
  • Camel :: Jackson 3 Avro
  • Camel :: Jackson 3 Protobuf
  • Camel :: Jackson 3 XML
  • Camel :: Jackson Avro
  • Camel :: Jackson Protobuf
  • Camel :: Jackson XML
  • Camel :: Jandex
  • Camel :: Jasypt
  • Camel :: Java DSL IO
  • Camel :: Java DSL with jOOR
  • Camel :: Java Flight Recorder
  • Camel :: Java Template Engine
  • Camel :: Java Toolbox for IBM i
  • Camel :: JavaScript
  • Camel :: Jetty
  • Camel :: Jetty :: Common
  • Camel :: Jolt
  • Camel :: Jsch
  • Camel :: Jslt
  • Camel :: JsonPatch (deprecated)
  • Camel :: Kafka
  • Camel :: Kamelet
  • Camel :: Kamelet Main
  • Camel :: Kamelet Main :: Support
  • Camel :: Keycloak
  • Camel :: Knative :: Parent
  • Camel :: Knative API
  • Camel :: Knative Component
  • Camel :: Knative HTTP
  • Camel :: Kubernetes
  • Camel :: Kudu
  • Camel :: LDAP
  • Camel :: LDIF
  • Camel :: LZF
  • Camel :: Language
  • Camel :: Launcher
  • Camel :: Launcher :: Container
  • Camel :: LevelDB (deprecated)
  • Camel :: Log
  • Camel :: Long-Running-Action
  • Camel :: Lucene
  • Camel :: Lumberjack
  • Camel :: MDC
  • Camel :: MINA
  • Camel :: MINA SFTP
  • Camel :: MLLP
  • Camel :: MVEL
  • Camel :: Mail
  • Camel :: Mail :: Microsoft OAuth
  • Camel :: Main
  • Camel :: Management
  • Camel :: Management API
  • Camel :: Mapstruct
  • Camel :: Master
  • Camel :: Maven Plugins :: Camel API Component Plugin
  • Camel :: Maven Plugins :: Camel Maven Plugin
  • Camel :: Maven Plugins :: OpenApi REST DSL Generator
  • Camel :: Metrics
  • Camel :: MicroProfile :: Config
  • Camel :: MicroProfile :: Fault Tolerance
  • Camel :: MicroProfile :: Health
  • Camel :: MicroProfile :: Parent
  • Camel :: Micrometer
  • Camel :: Micrometer :: Observability 2
  • Camel :: Micrometer :: Observation (deprecated)
  • Camel :: Micrometer :: Prometheus
  • Camel :: Milo
  • Camel :: MinIO
  • Camel :: Mock
  • Camel :: MongoDB
  • Camel :: MongoDB GridFS
  • Camel :: Mustache
  • Camel :: MyBatis
  • Camel :: Nats
  • Camel :: Netty
  • Camel :: Netty HTTP
  • Camel :: OAIPMH
  • Camel :: OAuth
  • Camel :: OCSF
  • Camel :: OGNL (deprecated)
  • Camel :: Observability Services
  • Camel :: Olingo2 (Deprecated) :: API
  • Camel :: Olingo2 (Deprecated) :: Component
  • Camel :: Olingo2 (Deprecated) :: Parent
  • Camel :: Olingo4 (Deprecated) :: API
  • Camel :: Olingo4 (Deprecated) :: Component
  • Camel :: Olingo4 (Deprecated) :: Parent
  • Camel :: Once
  • Camel :: OpenAPI :: Validator
  • Camel :: OpenApi Java
  • Camel :: OpenSearch Java API Client
  • Camel :: OpenStack
  • Camel :: OpenTelemetry (deprecated)
  • Camel :: Opentelemetry 2
  • Camel :: Opentelemetry Metrics
  • Camel :: OptaPlanner
  • Camel :: PDF
  • Camel :: PLC4X
  • Camel :: PQC
  • Camel :: Paho (deprecated)
  • Camel :: Paho MQTT 5
  • Camel :: Parquet Avro
  • Camel :: PgEvent
  • Camel :: PgReplicationSlot
  • Camel :: Platform HTTP
  • Camel :: Platform HTTP :: Jolokia
  • Camel :: Platform HTTP :: Main
  • Camel :: Platform HTTP :: Vert.x
  • Camel :: Printer
  • Camel :: Protobuf
  • Camel :: PubNub
  • Camel :: Pulsar
  • Camel :: Python
  • Camel :: Quartz
  • Camel :: QuickFIX/J
  • Camel :: REST
  • Camel :: REST OpenApi
  • Camel :: RSS
  • Camel :: Reactive Executor :: Tomcat
  • Camel :: Reactive Executor :: Vert.x (deprecated)
  • Camel :: Reactive Streams
  • Camel :: Reactor
  • Camel :: Redis
  • Camel :: Ref
  • Camel :: Resilience4j
  • Camel :: Resilience4j :: Micrometer
  • Camel :: ResourceResolver GitHub
  • Camel :: RobotFramework
  • Camel :: RocketMQ
  • Camel :: RxJava
  • Camel :: SAP NetWeaver
  • Camel :: SMB
  • Camel :: SMPP
  • Camel :: SNMP
  • Camel :: SOAP
  • Camel :: SQL
  • Camel :: SSH
  • Camel :: SWIFT
  • Camel :: Saga
  • Camel :: Salesforce
  • Camel :: Salesforce :: CodeGen
  • Camel :: Salesforce :: Maven Plugin
  • Camel :: Salesforce :: Parent
  • Camel :: Saxon
  • Camel :: Scheduler
  • Camel :: Schematron
  • Camel :: Seda
  • Camel :: ServiceNow :: Component
  • Camel :: ServiceNow :: Maven Plugin
  • Camel :: ServiceNow :: Parent
  • Camel :: Servlet
  • Camel :: Shell
  • Camel :: Shiro
  • Camel :: Simple JMS
  • Camel :: Simple JMS2
  • Camel :: Slack
  • Camel :: Smooks :: Parent
  • Camel :: SnakeYAML
  • Camel :: Solr
  • Camel :: Splunk (deprecated)
  • Camel :: Splunk HEC
  • Camel :: Spring
  • Camel :: Spring :: Parent
  • Camel :: Spring AI :: Chat
  • Camel :: Spring AI :: Embeddings
  • Camel :: Spring AI :: Image
  • Camel :: Spring AI :: Parent
  • Camel :: Spring AI :: Tools
  • Camel :: Spring AI :: Vector Store
  • Camel :: Spring Batch
  • Camel :: Spring Cloud Config
  • Camel :: Spring JDBC
  • Camel :: Spring LDAP
  • Camel :: Spring Main
  • Camel :: Spring RabbitMQ
  • Camel :: Spring Redis
  • Camel :: Spring Security
  • Camel :: Spring Web Services
  • Camel :: Spring XML
  • Camel :: StAX
  • Camel :: Stitch
  • Camel :: Stream
  • Camel :: StringTemplate
  • Camel :: Stripe
  • Camel :: Stub
  • Camel :: Support
  • Camel :: Syslog
  • Camel :: Tahu
  • Camel :: Tar File
  • Camel :: Telegram
  • Camel :: Telemetry :: Dev
  • Camel :: Test :: JUnit5
  • Camel :: Test :: JUnit6
  • Camel :: Test :: Main :: JUnit5
  • Camel :: Test :: Main :: JUnit6
  • Camel :: Test :: Parent
  • Camel :: Test :: Spring :: JUnit5
  • Camel :: Test Infra :: All test services
  • Camel :: Test Infra :: Artemis
  • Camel :: Test Infra :: Cli (Camel CLI)
  • Camel :: Test Infra :: Core
  • Camel :: Test Infra :: Server Message Block
  • Camel :: Thread Pool Factory :: Vert.x (deprecated)
  • Camel :: Thrift
  • Camel :: Thymeleaf
  • Camel :: Tika
  • Camel :: Timer
  • Camel :: Tooling :: Maven
  • Camel :: Tooling :: OpenApi REST DSL Generator
  • Camel :: Twilio
  • Camel :: Twitter
  • Camel :: Undertow
  • Camel :: Undertow Spring Security
  • Camel :: UniVocity Parsers
  • Camel :: Validator
  • Camel :: Velocity
  • Camel :: Vert.x :: Common
  • Camel :: Vert.x :: HTTP
  • Camel :: Vert.x :: Parent
  • Camel :: Vert.x :: WebSocket
  • Camel :: Vertx
  • Camel :: WAL
  • Camel :: Wasm
  • Camel :: Weather
  • Camel :: Web3j
  • Camel :: Webhook
  • Camel :: Whatsapp
  • Camel :: Wordpress
  • Camel :: Workday
  • Camel :: XChange
  • Camel :: XJ
  • Camel :: XML DSL Jaxb :: Test :: Definition
  • Camel :: XML DSL Jaxb :: Test :: Spring
  • Camel :: XML DSL with camel-xml-io
  • Camel :: XML DSL with camel-xml-jaxb
  • Camel :: XML IO
  • Camel :: XML JAXB
  • Camel :: XML JAXP
  • Camel :: XML Security
  • Camel :: XMPP
  • Camel :: XPath
  • Camel :: XSLT
  • Camel :: XSLT Saxon
  • Camel :: YAML DSL
  • Camel :: YAML DSL :: Common
  • Camel :: YAML DSL :: Deserializers
  • Camel :: YAML DSL :: Maven Plugins
  • Camel :: YAML DSL :: Validator
  • Camel :: YAML DSL :: Validator Maven Plugin
  • Camel :: YAML IO
  • Camel :: Zeebe (deprecated)
  • Camel :: Zendesk
  • Camel :: Zip Deflater
  • Camel :: Zip File
  • Camel :: Zookeeper
  • Camel :: Zookeeper Master
  • Camel :: csimple jOOR (deprecated)
  • Camel :: gRPC
  • Camel :: iCal
  • Camel :: jOOR

⚙️ View full build and test results

@gnodet gnodet force-pushed the CAMEL-23264-splitter-enhancements branch from ad43981 to 79bad2e Compare July 2, 2026 19:40
@gnodet

gnodet commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

Done — rebased onto latest main (5 new commits since last push). Clean rebase, no conflicts. CI is running now.

Claude Code on behalf of Guillaume Nodet

@gnodet gnodet requested review from davsclaus July 2, 2026 19:41
gnodet and others added 14 commits July 2, 2026 22:27
… failure tracking

- Add group(int) option to chunk split items into List batches using GroupIterator
- Add errorThreshold(double) to abort when failure ratio exceeds threshold
- Add maxFailedRecords(int) to abort after N failures
- Add SplitResult exchange property with structured failure details
- Extract shouldContinueOnFailure() in MulticastProcessor for subclass override
- Mutually exclusive validation: stopOnException vs errorThreshold/maxFailedRecords

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Index-based watermarking: skip already-processed items on subsequent runs
- Value-based watermarking: expose stored watermark as exchange property,
  evaluate Simple expression after completion to determine new value
- Watermark is only updated on successful completion (not on abort)
- Add SPLIT_WATERMARK exchange property constant

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Evaluate watermark expression per-item via ProcessorExchangePair.done()
  hook instead of requiring a custom aggregation strategy
- Add WatermarkProcessorExchangePair wrapper for thread-safe per-item
  watermark tracking using AtomicReference
- Add SplitterTransactedTest with 6 tests covering group, error threshold,
  split result, and watermark features using the MulticastTransactedTask
  code path

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Regenerated: catalog split.json, Spring/XML-IO XSD schemas, XML/YAML
ModelParser/ModelWriter, YAML DSL ModelDeserializers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix index-based watermark producing wrong offset when combined with
  group(): track raw item count independently of chunk index
- Optimize double readCurrentWatermark() call by reusing exchange property
- Refactor watermark from Map<String,String> to ResumeStrategy SPI
- Add validation for errorThreshold range and watermarkKey/resumeStrategy
  completeness
- Add documentation for all new features (group, errorThreshold,
  maxFailedRecords, SplitResult, watermark tracking) to split-eip.adoc
- Document parallel processing limitations for errorThreshold
- Document concurrent exchange limitations for watermark tracking
- Add upgrade guide section for Split EIP enhancements
- Add tests: group+watermark, parallel+errorThreshold,
  group+errorThreshold, streaming+parallel+maxFailedRecords,
  streaming mode, validation, and ResumeStrategy test helper

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ents

- Clarify SplitResult.totalItems counts chunks (not individual items) when group() is used
- Add LOG.debug in readFromStrategyCache() catch block for debuggability
- Document that custom AggregationStrategy won't see individual item exceptions
  when error thresholds are configured (exceptions cleared after recording)
- Update SplitResult code example to note chunk counting with group()

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tegy rename

Fix stale watermarkStore references in XSD schemas, ModelParser, and
ModelWriter files that were generated before the field was renamed to
resumeStrategy.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…r Splitter enhancements

- Extract setupFailureTracking(), setupWatermarkTracking(), wrapCallback() from Splitter.process()
- Extract configureErrorThreshold(), configureWatermark() from SplitReifier.createProcessor()
- Add tests: SplitResult.toString(), null failures constructor, empty input, Failure record
- Add tests: watermark expression returning null, all items failing, combined errorThreshold+watermark
- Add tests: empty input with watermark, single item, value watermark no-update-on-abort
- Add tests: error threshold boundary values, exact boundary, empty input

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… tags, regenerate

- Remove Split EIP section from upgrade guide (davsclaus: new features
  don't belong in the upgrade guide, only migration info)
- Add @SInCE 4.21 to SplitResult class and Failure record (oscerd)
- Regenerate all downstream artifacts after rebase onto latest main

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix @SInCE 4.21 to @SInCE 4.22 on SplitResult and Failure record
- Add @SInCE 4.22 to Exchange.SPLIT_RESULT and SPLIT_WATERMARK constants
- Add SPLIT_WATERMARK to ExchangePropertyKey enum and asExchangePropertyKey()
- Reject negative group values in SplitReifier with IllegalArgumentException
- Fix watermark property leak on abort: clean up internal properties in
  finally block so they don't leak to downstream processors
- Fix setWatermarkExpression javadoc to match actual per-item semantics
- Regenerate camelYamlDsl.json with full descriptions from @metadata
  annotations (fixes CI "uncommitted changes" failure)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@gnodet gnodet merged commit 534b88a into apache:main Jul 3, 2026
11 of 24 checks passed
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.

5 participants