Skip to content

Pulsar: native per-message redelivery (#3177)#3199

Merged
jeremydmiller merged 1 commit into
mainfrom
feat/pulsar-per-message-redelivery-3177
Jun 22, 2026
Merged

Pulsar: native per-message redelivery (#3177)#3199
jeremydmiller merged 1 commit into
mainfrom
feat/pulsar-per-message-redelivery-3177

Conversation

@jeremydmiller

Copy link
Copy Markdown
Member

Part of the Pulsar re-evaluation epic #3176. Fixes #3177 (reduced scope — DotPulsar 5.1.2 has no negative-acknowledgment; delayed/backoff redelivery stays with the retry-letter topics, #3182).

Adds opt-in native per-message redelivery: instead of acknowledging a failed message and re-publishing a fresh copy to the source topic, the message is left unacknowledged and Pulsar is asked to redeliver just that one message via RedeliverUnacknowledgedMessages([messageId]), preserving its redelivery count.

Changes

  • PulsarEndpoint.UseNativeRedelivery + PulsarListenerConfiguration.UseNativeRedelivery().
  • PulsarListener.DeferAsync / TryRequeueAsync issue RedeliverUnacknowledgedMessages([id]) when enabled.
  • Key fix: the Pulsar native-resiliency continuation (an AlwaysMatches failure rule installed by UsePulsar, which preempts the generic Requeue continuation) previously no-op'd a failure when no retry-letter/dead-letter topic was configured — leaving the message hanging. It now performs native per-message redelivery in that case when UseNativeRedelivery is set. Existing retry-letter / DLQ / opt-out behavior is unchanged.

Tests

  • Config unit test (flag wiring).
  • Integration test: a handler that throws on its first delivery is redelivered by Pulsar and succeeds on the retry.

Docs

New "Per-Message Redelivery" section, noting that bounded/backoff redelivery uses the retry-letter topics.

🤖 Generated with Claude Code

DotPulsar 5.1.2 has no negative-acknowledgment, so this adds opt-in native per-message
redelivery using RedeliverUnacknowledgedMessages([messageId]) — the message is left
unacknowledged and Pulsar redelivers just that one message (preserving its redelivery count)
instead of acknowledging and re-publishing a fresh copy.

- PulsarEndpoint.UseNativeRedelivery flag; PulsarListenerConfiguration.UseNativeRedelivery().
- PulsarListener.DeferAsync/TryRequeueAsync issue RedeliverUnacknowledgedMessages([id]) when set.
- Key wiring: the Pulsar native-resiliency continuation (an AlwaysMatches failure rule applied by
  UsePulsar) previously no-op'd a failure when no retry-letter/dead-letter topic was configured,
  which preempts the generic Requeue continuation. It now performs native per-message redelivery
  in that case when UseNativeRedelivery is enabled. Existing retry-letter / DLQ / opt-out behavior
  is unchanged.

Delayed/backoff redelivery remains the retry-letter topics' job (#3182).

Tests: config unit test + integration test (handler fails first delivery, native redelivery
re-delivers the same message, retry succeeds). Docs updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jeremydmiller jeremydmiller merged commit 40d0b59 into main Jun 22, 2026
25 checks passed
This was referenced Jun 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Pulsar: per-message redelivery (no native nack in DotPulsar)

1 participant