Skip to content

Setting explicit acknowledgment via ShareKafkaListenerContainerFactory container properties does not enable explicit acknowledgment mode for Share Groups #4369

@j-tim

Description

@j-tim

In what version(s) of Spring for Apache Kafka are you seeing this issue?

4.0.4

Describe the bug

The documentation states there are two ways to enable explicit acknowledgment in shared groups in Spring Kafka:

  • Option 1 is working props.put(ConsumerConfig.SHARE_ACKNOWLEDGEMENT_MODE_CONFIG, "explicit");.
  • Option 2: is not working factory.getContainerProperties().setExplicitShareAcknowledgment(true);

To Reproduce

Steps to reproduce the behavior.

  1. Start the application
./mvnw spring-boot:run -Dspring-boot.run.profiles=explicit
  1. Publish a valid message to the topic
curl -X POST "http://localhost:8080/produce?message=Hi"
  1. Observe the logs, the setting on the ShareConsumerConfig show we are still using implicit acknowledgment mode
2026-03-26T11:05:46.702+01:00  INFO 55104 --- [           main] o.a.kafka.common.config.AbstractConfig   : ShareConsumerConfig values: 
        share.acknowledgement.mode = implicit
  1. Observe the logs, we can't acknowledge the message we cause we are in implicit acknowledgment mode. Resulting in this exception in our Spring Kafka consumer:
2026-03-26T11:06:02.761+01:00 ERROR 55104 --- [Container#0-C-1] s.k.l.ShareKafkaMessageListenerContainer : Failed to process queued acknowledgment for record: ConsumerRecord(topic = high-throughput-topic, partition = 0, leaderEpoch = 0, offset = 2, CreateTime = 1774519562719, deliveryCount = 1, serialized key size = -1, serialized value size = 2, headers = RecordHeaders(headers = [], isReadOnly = false), key = null, value = Hi)

java.lang.IllegalStateException: Implicit acknowledgement of delivery is being used.
        at org.apache.kafka.clients.consumer.internals.ShareConsumerImpl.ensureExplicitAcknowledgement(ShareConsumerImpl.java:1060) ~[kafka-clients-4.1.2.jar:na]
        at org.apache.kafka.clients.consumer.internals.ShareConsumerImpl.acknowledge(ShareConsumerImpl.java:688) ~[kafka-clients-4.1.2.jar:na]
        at org.apache.kafka.clients.consumer.KafkaShareConsumer.acknowledge(KafkaShareConsumer.java:507) ~[kafka-clients-4.1.2.jar:na]
        at org.springframework.kafka.listener.ShareKafkaMessageListenerContainer$ShareListenerConsumer.processQueuedAcknowledgments(ShareKafkaMessageListenerContainer.java:489) ~[spring-kafka-4.0.4.jar:4.0.4]
        at org.springframework.kafka.listener.ShareKafkaMessageListenerContainer$ShareListenerConsumer.run(ShareKafkaMessageListenerContainer.java:344) ~[spring-kafka-4.0.4.jar:4.0.4]
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1825) ~[na:na]
        at java.base/java.lang.Thread.run(Thread.java:1474) ~[na:na]

Expected behavior

When applying option 2 as described in the documentation, the ShareConsumerConfig should show we are using explicit acknowledgment mode, and we should be able to acknowledge messages in our Spring Kafka consumer.

Sample

We create a minimal reproducible example see: spring-kafka-share-groups-kip-932-poc

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions