Skip to content

CAMEL-24086: camel-aws2-sqs - give each FIFO batch entry a distinct MessageDeduplicationId#24728

Merged
oscerd merged 1 commit into
apache:mainfrom
oscerd:fix/CAMEL-24086
Jul 16, 2026
Merged

CAMEL-24086: camel-aws2-sqs - give each FIFO batch entry a distinct MessageDeduplicationId#24728
oscerd merged 1 commit into
apache:mainfrom
oscerd:fix/CAMEL-24086

Conversation

@oscerd

@oscerd oscerd commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Description

Fixes CAMEL-24086.

When sending a batch (a List body, or a String split by batchSeparator) to a FIFO SQS queue, every entry is built from the same Exchange, so configureFifoAttributes(SendMessageBatchRequestEntry.Builder, Exchange) derived the MessageDeduplicationId from that one Exchange. The default ExchangeIdMessageDeduplicationIdStrategy returns exchange.getExchangeId() — identical for all entries — so SQS accepted the batch but silently dropped all but the first message within the 5-minute deduplication window.

Fix

  • The batch overload now appends the entry position to the strategy-provided id (<id>-<index>), giving each message a distinct, deterministic deduplication id — a redelivered batch still deduplicates correctly.
  • A null id (content-based deduplication via NullMessageDeduplicationIdStrategy) is left unset.
  • The group-id / dedup-id strategies are now null-guarded consistently with the single-message overload (the batch overload previously could NPE on a null strategy).
  • The single-message send path is unchanged.

Tests

Adds SqsProducerFifoBatchDeduplicationTest — sends a 4-element batch to a .fifo queue and asserts the four entries receive four distinct deduplication ids (and each sets a group id). Against the old code all four shared one id, so the test fails without the fix. The existing SqsProducerBatchTest still passes.

Scope note

This PR addresses only the FIFO deduplication-id collision. The separate "batch not chunked to the 10-entry API limit" observation is not included here.

Backport

Same code on camel-4.18.x and camel-4.14.x; will be backported after merge (fixVersions 4.22.0 / 4.18.4 / 4.14.9).


Claude Code on behalf of oscerd

…essageDeduplicationId

When sending a batch to a FIFO queue, every entry is built from the same
Exchange, so configureFifoAttributes derived the MessageDeduplicationId from
that one Exchange via the configured strategy. The default
ExchangeIdMessageDeduplicationIdStrategy returns exchange.getExchangeId(),
identical for all entries, so SQS accepted the batch but silently dropped all
but the first message within the deduplication window.

The batch overload now appends the entry position to the strategy-provided id,
giving each message a distinct, deterministic deduplication id (so a redelivered
batch still deduplicates correctly). A null id (content-based deduplication via
NullMessageDeduplicationIdStrategy) is left unset, and the group-id / dedup-id
strategies are now null-guarded consistently with the single-message overload.

Adds SqsProducerFifoBatchDeduplicationTest asserting the batch entries receive
distinct deduplication ids. The single-message send path is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: Andrea Cosentino <ancosen@gmail.com>
@oscerd oscerd added the bug Something isn't working label Jul 15, 2026
@oscerd oscerd requested review from Croway and davsclaus July 15, 2026 13:33
@github-actions

Copy link
Copy Markdown
Contributor

🌟 Thank you for your contribution to the Apache Camel project! 🌟
🤖 CI automation will test this PR automatically.

🐫 Apache Camel Committers, please review the following items:

  • First-time contributors require MANUAL approval for the GitHub Actions to run
  • You can use the command /component-test (camel-)component-name1 (camel-)component-name2.. to request a test from the test bot although they are normally detected and executed by CI.
  • You can label PRs using skip-tests and test-dependents to fine-tune the checks executed by this PR.
  • Build and test logs are available in the summary page. Only Apache Camel committers have access to the summary.

⚠️ Be careful when sharing logs. Review their contents before sharing them publicly.

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

Clean, well-scoped fix for FIFO batch deduplication. A few observations:

What the PR does well:

  • Correctly identifies that MessageDeduplicationId must be unique per batch entry — SQS silently drops entries with duplicate dedup IDs in FIFO queues
  • Appending -<index> is deterministic and preserves the strategy-derived prefix, so the same batch re-sent produces the same per-entry IDs (idempotency preserved)
  • Adds ObjectHelper.isNotEmpty() null guards on the batch path, aligning with the single-message configureFifoAttributes overload (line 227–238) which already had them
  • Handles the null dedup ID case (content-based deduplication) by leaving it unset — correct behavior
  • Covers both entry paths (Iterable and String-split)
  • Good test with distinct ID assertion via HashSet size check

Checklist:

  • Tests: new SqsProducerFifoBatchDeduplicationTest covers the fix
  • Commit convention: JIRA-linked (CAMEL-24086)
  • Backward compatibility: maintained — only batch FIFO behavior changes (and was broken before)
  • No public API changes
  • Mock class already supports getSendMessageBatchRequests() — no test infra changes needed

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

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

Clean, well-scoped fix for the FIFO batch deduplication-id collision. The three changes are correct and minimal:

  • Index-suffixed dedup ID (<strategy-id>-<index>) gives each batch entry a distinct, deterministic id — redelivered batches still deduplicate correctly
  • Null id (content-based dedup via NullMessageDeduplicationIdStrategy) is correctly left unset
  • Null guards on the batch overload now match the single-message overload, fixing a potential NPE

Test covers the key scenario (4-element batch → 4 distinct dedup ids). Single-message send path is unchanged.

This review was generated by an AI agent and may contain inaccuracies. Please verify all suggestions before applying.

@github-actions

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • components/camel-aws/camel-aws2-sqs

🔬 Scalpel shadow comparison — Scalpel: 10 tested, 29 compile-only — current: 10 all tested

Maveniverse Scalpel detected 39 affected modules (current approach: 10).

⚠️ 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 10 modules (1 direct + 9 downstream), skip tests for 29 (generated code, meta-modules)

Modules Scalpel would test (10)
  • camel-aws2-eventbridge
  • camel-aws2-sqs
  • camel-jbang-mcp
  • camel-jbang-plugin-mcp
  • camel-jbang-plugin-route-parser
  • camel-jbang-plugin-tui
  • camel-jbang-plugin-validate
  • camel-launcher-container
  • camel-yaml-dsl-validator
  • camel-yaml-dsl-validator-maven-plugin
Modules with tests skipped (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

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

All tested modules (39 modules)
  • Camel :: AWS2 Eventbridge
  • Camel :: AWS2 SQS
  • Camel :: All Components Sync point
  • Camel :: Assembly
  • Camel :: Catalog :: CSimple Maven Plugin (deprecated)
  • Camel :: Catalog :: Camel Catalog
  • Camel :: Catalog :: Camel Report Maven Plugin
  • Camel :: Catalog :: Camel Route Parser
  • Camel :: Catalog :: Console
  • Camel :: Catalog :: Dummy Component
  • Camel :: Catalog :: Lucene (deprecated)
  • Camel :: Catalog :: Maven
  • Camel :: Catalog :: Suggest
  • Camel :: Component DSL
  • Camel :: Coverage
  • Camel :: Docs
  • Camel :: Endpoint DSL
  • Camel :: Endpoint DSL :: Support
  • Camel :: Integration Tests
  • 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 :: Kamelet Main
  • Camel :: Launcher
  • Camel :: Launcher :: Container
  • Camel :: YAML DSL
  • Camel :: YAML DSL :: Deserializers
  • Camel :: YAML DSL :: Maven Plugins
  • Camel :: YAML DSL :: Validator
  • Camel :: YAML DSL :: Validator Maven Plugin

⚙️ View full build and test results

@oscerd oscerd merged commit d901b4f into apache:main Jul 16, 2026
5 checks passed
@oscerd oscerd self-assigned this Jul 16, 2026
@oscerd oscerd added this to the 4.22.0 milestone Jul 16, 2026
oscerd added a commit that referenced this pull request Jul 16, 2026
…batch entry a distinct MessageDeduplicationId (#24785)

CAMEL-24086: camel-aws2-sqs - give each FIFO batch entry a distinct MessageDeduplicationId (#24728)

When sending a batch to a FIFO queue, every entry is built from the same
Exchange, so configureFifoAttributes derived the MessageDeduplicationId from
that one Exchange via the configured strategy. The default
ExchangeIdMessageDeduplicationIdStrategy returns exchange.getExchangeId(),
identical for all entries, so SQS accepted the batch but silently dropped all
but the first message within the deduplication window.

The batch overload now appends the entry position to the strategy-provided id,
giving each message a distinct, deterministic deduplication id (so a redelivered
batch still deduplicates correctly). A null id (content-based deduplication via
NullMessageDeduplicationIdStrategy) is left unset, and the group-id / dedup-id
strategies are now null-guarded consistently with the single-message overload.

Adds SqsProducerFifoBatchDeduplicationTest asserting the batch entries receive
distinct deduplication ids. The single-message send path is unchanged.

Signed-off-by: Andrea Cosentino <ancosen@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
oscerd added a commit that referenced this pull request Jul 16, 2026
…batch entry a distinct MessageDeduplicationId (#24786)

CAMEL-24086: camel-aws2-sqs - give each FIFO batch entry a distinct MessageDeduplicationId (#24728)

When sending a batch to a FIFO queue, every entry is built from the same
Exchange, so configureFifoAttributes derived the MessageDeduplicationId from
that one Exchange via the configured strategy. The default
ExchangeIdMessageDeduplicationIdStrategy returns exchange.getExchangeId(),
identical for all entries, so SQS accepted the batch but silently dropped all
but the first message within the deduplication window.

The batch overload now appends the entry position to the strategy-provided id,
giving each message a distinct, deterministic deduplication id (so a redelivered
batch still deduplicates correctly). A null id (content-based deduplication via
NullMessageDeduplicationIdStrategy) is left unset, and the group-id / dedup-id
strategies are now null-guarded consistently with the single-message overload.

Adds SqsProducerFifoBatchDeduplicationTest asserting the batch entries receive
distinct deduplication ids. The single-message send path is unchanged.

Signed-off-by: Andrea Cosentino <ancosen@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@oscerd oscerd deleted the fix/CAMEL-24086 branch July 16, 2026 13:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working components components-aws

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants