Closed chickenchickenlove closed 21 hours ago
3.3-SNAPSHOT
From this issue, spring-kafka supports async retry with retry topic. However, IMHO, spring-kafka has a potential bug described below. https://github.com/spring-projects/spring-kafka/blob/70a11a698284ce68293eaaf735fb9756713a3bec/spring-kafka/src/main/java/org/springframework/kafka/listener/KafkaMessageListenerContainer.java#L1467-L1469
spring-kafka
We can imagine this scenario. (Thread A is thread in executor for Mono or CompletableFuture)
Thread A
Mono
CompletableFuture
Main Thread
failedRecords
failedRecords.size()
failedRecords.clear()
In this scenario, Main thread has 100 failed records to retry. But, Main Thread removed 101 failed records. Therefore, 1 failed record will be missed.
Main thread
The KafkaMessageListenerContainer should not miss any failedRecords during handleAsyncFailure.
KafkaMessageListenerContainer
handleAsyncFailure
In what version(s) of Spring for Apache Kafka are you seeing this issue?
3.3-SNAPSHOT
Describe the bug
From this issue,
spring-kafka
supports async retry with retry topic. However, IMHO,spring-kafka
has a potential bug described below. https://github.com/spring-projects/spring-kafka/blob/70a11a698284ce68293eaaf735fb9756713a3bec/spring-kafka/src/main/java/org/springframework/kafka/listener/KafkaMessageListenerContainer.java#L1467-L1469We can imagine this scenario. (
Thread A
is thread in executor forMono
orCompletableFuture
)Main Thread
: copy records fromfailedRecords
. In this time,failedRecords.size()
is 100. so, Main Thread has 100 failed records to retry.Thread A
: Oops! I encounter an exception during operation. Add this record tofailedRecords
. then,failedRecords.size()
is 101.Main Thread
: clearfailedRecords
by executingfailedRecords.clear()
.In this scenario,
Main thread
has 100 failed records to retry. But,Main Thread
removed 101 failed records. Therefore, 1 failed record will be missed.To Reproduce
Expected behavior
The
KafkaMessageListenerContainer
should not miss anyfailedRecords
duringhandleAsyncFailure
.Sample