spring嵌入的kafka在测试之间刷新消息

e4yzc0pl  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(443)

我用SpringKafka和 @EmbeddedKafka 注解以启动嵌入的kafka示例。
附属国:

<dependency>
  <groupId>org.springframework.kafka</groupId>
  <artifactId>spring-kafka-test</artifactId>
  <scope>test</scope>
</dependency>

我已经将我的应用程序配置为连接到它:

spring:
  kafka:
    bootstrap-servers: ${spring.embedded.kafka.brokers}

我正在成功地发送消息和消费消息。
我的问题是消息被保留在某个地方,并且可能出现在正在进行的测试运行中。日志正在打印这些:

Successfully joined group with generation 117

高代数表示kafka在测试重新运行之间保留了我不想要的信息。
如何彻底清理Kafka,重新开始?
编辑:
我遇到的问题是我使用的spring配置文件不正确。我有一个自定义的注解和我的嵌入式Kafka配置。问题是我在设置 @ActiveProfiles("kafka") 在复合注解中,以及 @ActiveProfiles("dev") 在实际的测试类中。我已将复合注解更新为:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
// @ActiveProfiles("kafka") REMOVED
@TestPropertySource(properties = "spring.kafka.bootstrap-servers=${spring.embedded.kafka.brokers}")
@EmbeddedKafka(/* config properties */)
public @interface CustomEmbeddedKafka{
}
5kgi1eie

5kgi1eie1#

你需要使用 @DirtiesContext 在测试之间清理应用程序上下文。再加上嵌入的Kafka经纪人也将被摧毁。
如果问题是在一个测试类方法之间,那么您需要重新考虑那里的逻辑,不要干扰不同方法中的相同主题。
你也可以考虑使用 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) ,但这将是某种性能下降,因为在每个测试方法之前都会重新创建一个应用程序上下文和一个嵌入式kafka。
更新
试试这个建议而不是 application.properties 修改:

static {
    System.setProperty(EmbeddedKafkaBroker.BROKER_LIST_PROPERTY,
            "spring.kafka.bootstrap-servers");
}

看到了吗https://docs.spring.io/spring-kafka/docs/2.2.5.release/reference/#kafka-测试嵌入式Kafka注解

相关问题