[英]Spring Kafka Requirements for Supporting Multiple Consumers
正如人们所期望的那样,它的共同点是希望不同的消费者以不同的方式反序列化 Kafka 中的主题。 spring 启动自动配置存在一个已知问题。 似乎一旦定义了其他工厂 Spring Kafka 或自动配置抱怨无法再找到合适的消费者工厂。 有人指出,一种解决方案是在配置中包含一个类型为 (Object, Object) 的 ConsumerFactory。 但是没有人展示它的源代码或澄清它是否需要以任何特定方式命名。 或者,如果只是将此消费者添加到配置中,则无需关闭自动配置。 所有这些都还很不清楚。
如果您不熟悉此问题,请阅读https://github.com/spring-projects/spring-boot/issues/19221
在刚刚声明好的地方,定义 ConsumerFactory 并将其添加到配置中的某个位置。 有人可以对此更精确一点吗?
最简单的解决方案是坚持使用 Boot 的自动配置并覆盖@KafkaListener
本身的反序列化器......
@SpringBootApplication
public class So63108344Application {
public static void main(String[] args) {
SpringApplication.run(So63108344Application.class, args);
}
@KafkaListener(id = "so63108344-1", topics = "so63108344-1")
public void listen1(String in) {
System.out.println(in);
}
@KafkaListener(id = "so63108344-2", topics = "so63108344-2", properties =
ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG +
"=org.apache.kafka.common.serialization.ByteArrayDeserializer")
public void listen2(byte[] in) {
System.out.println(in);
}
@Bean
public NewTopic topic1() {
return TopicBuilder.name("so63108344-1").partitions(1).replicas(1).build();
}
@Bean
public NewTopic topic2() {
return TopicBuilder.name("so63108344-2").partitions(1).replicas(1).build();
}
}
对于更高级的容器定制(或者如果您不想污染@KafkaListener
,您可以使用ContainerCustomizer
...
@Component
class Customizer {
public Customizer(ConcurrentKafkaListenerContainerFactory<?, ?> factory) {
factory.setContainerCustomizer(container -> {
if (container.getGroupId().equals("so63108344-2")) {
container.getContainerProperties().setAckMode(AckMode.MANUAL_IMMEDIATE);
container.getContainerProperties().getKafkaConsumerProperties()
.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.ByteArrayDeserializer");
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.