You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2026/10/03 20:38:00 UTC
[jira] [Resolved] (CAMEL-25274) camel-dapr - the pub/sub consumer acknowledges every event with SUCCESS before the route has processed it, so Dapr drops the events whose route fails
[ https://issues.apache.org/jira/browse/CAMEL-25274?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen resolved CAMEL-25274.
---------------------------------
Resolution: Fixed
> camel-dapr - the pub/sub consumer acknowledges every event with SUCCESS before the route has processed it, so Dapr drops the events whose route fails
> -----------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-25274
> URL: https://issues.apache.org/jira/browse/CAMEL-25274
> Project: Camel
> Issue Type: Bug
> Components: camel-dapr
> Reporter: shashank
> Assignee: shashank
> Priority: Major
> Fix For: 4.23.0
>
>
> {{DaprPubSubConsumer}} subscribes with the Dapr streaming subscription ({{DaprPreviewClient.subscribeToEvents}}) and its listener does:
> {code:java}
> public Mono<Status> onEvent(CloudEvent<byte[]> cloudEvent) {
> final Exchange exchange = createServiceBusExchange(cloudEvent);
> AsyncCallback cb = defaultConsumerCallback(exchange, true);
> getAsyncProcessor().process(exchange, cb);
> return Mono.just(Status.SUCCESS);
> }
> {code}
> The returned status is the acknowledgement of the event: the SDK ({{io.dapr.client.Subscription}}) sends it to the sidecar as the {{TopicEventResponse}} status ({{SUCCESS}}, {{RETRY}} or {{DROP}}). So:
> * an event whose route fails is acknowledged with {{SUCCESS}}: Dapr does not redeliver it, and it is lost;
> * the event is acknowledged as soon as the exchange is handed to the route, before an asynchronous route has processed it.
> The SDK itself answers {{RETRY}} when a listener fails ({{onErrorReturn(Status.RETRY)}}).
> h3. Reproduction
> {{DaprPubSubConsumerTest}} (mocked client and processor, as the existing test):
> * {{testFailedExchangeIsRedelivered}}: the processor sets an exception on the exchange: main returns {{SUCCESS}}, expected {{RETRY}};
> * {{testEventIsAcknowledgedWhenTheExchangeIsDone}}: the processor completes later: on main the status is already there before the callback ({{expected: <false> but was: <true>}}).
> h3. Proposed fix
> Return a {{Mono}} that emits when the exchange is done: {{SUCCESS}} when it completed, {{RETRY}} when it failed. The existing test is adapted (its mocked processor now calls the callback, else the status never comes). With the fix the camel-dapr tests pass (54). The upgrade guide for 4.23 gets a note (failed events are now redelivered).
> Affected: 4.14.x, 4.18.x and main (same code since the consumer was added, #18015, 2025-05).
> Duplicate check (2026-10-02): JIRA text "dapr" (8 issues): CAMEL-23645 (open, moving to the new Topic API, no work linked) and features. GitHub pull requests "dapr pubsub": only the CAMEL-23630 header filter PRs.
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)