Search code examples
spring-kafkaspring-boot-testembedded-kafka

Multiple SpringBootTests using EmbeddedKafka fails with "only one 'RetryTopicConfigurationSupport'"


We have an application that makes use of Spring Kafka's non blocking retries via the RetryableTopic annotation.

We are in the middle of upgrading spring-kafka from 2.8.4 to 2.9.0.

We have several SpringBootTests that makes use of EmbeddedKafka. Each of these tests are marked with DirtyContext and AutoConfigureMockMvc

After upgrading, the first test would run fine, but the later test would fail to start the application with

Constructor threw exception; nested exception is java.lang.IllegalStateException: Only one 'RetryTopicConfigurationSupport' is allowed

I understand that the RetryTopicConfigurationSupport tries to ensures only one instance of itself is ever instantiated. So in the use case of running multiple unit tests, which includes multiple different SpringBootTests, how do we avoid hitting this problem?

I have tried marking the context dirty, but of course that didn't solve the problem as RetryTopicConfigurationSupport is using a static variable to track whether it has been instantiated before or not.

I have tried NOT marking the ContextDirty, but the later tests would fail to start the application because the Port is already in use.

Appreciate any advise!


Solution

  • Looks like this problem has been addressed in spring-kafka 3.0 and backported to 2.9.3 https://github.com/spring-projects/spring-kafka/issues/2477