我正在编写集成测试以测试kafka生产者。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {kafkaProducerConfig.class, KafkaProducerIT.InnerConfig.class})
@EnableConfigurationProperties(KafkaProducerInfo.class)
@ComponentScan(basePackages = "...")
public class KafkaProducerIT {
@ClassRule
public static EmbeddedKafkaRule embeddedKafka = new EmbeddedKafkaRule(1, true, "testtopic");
@Autowired
CustomKafkaProducer<String, String> KafkaProducer;
@Autowired
KafkaController kafkaController;
@Test
public void whenSendMessage_thenConsumeIt() throws InterruptedException {
KafkaProducer.produceMessageToKafkaTopic("ahahahwow", "testtopic");
kafkaController.countDownLatch.await();
}
@Configuration
public static class InnerConfig {
@Bean
public KafkaListenerContainerFactory<?> kafkaListenerContainerFactory(ConsumerFactory<String, Object> replyConsumerFactory) {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(replyConsumerFactory);
factory.setBatchListener(true);
return factory;
}
@Bean
KafkaController kafkaController() {
return new KafkaController();
}
}
public static class KafkaController {
CountDownLatch countDownLatch = new CountDownLatch(1);
@KafkaListener(topics = "testtopic")
public void listen(final String payload) {
countDownLatch.countDown();
}
}
}
想法是我想向主题发送消息,使用KafkaController
和CountDownLatch
阅读。
我遇到的问题是,CountDownLatch
永远不会触发,测试只会挂在await
上。
CustomKafkaProducer
只是一个在内部使用常规kafkaTemplate
的包装器。
p.s。
在调试期间,有几种情况下流进入侦听器并通过测试。因此问题与主题名称错误等无关。
答案 0 :(得分:0)
您需要为使用者设置auto.offset.reset =最早。默认值为最新,因此如果使用者在发送记录后开始,则会出现竞争状况。