Apache kafka 什么是ApacheKafka在Spring中的侦听器容器?

Apache kafka 什么是ApacheKafka在Spring中的侦听器容器?,apache-kafka,kafka-consumer-api,spring-kafka,Apache Kafka,Kafka Consumer Api,Spring Kafka,我明白,要使一个方法成为Kafka消息侦听器的目标,我必须用@KafkaListener注释来标记这个方法。 此注释允许通过containerFactory元素指定KafkaListenerContainerFactory 下面是Baeldung Spring Kafka教程的一些片段 KafkaConsumerConfig.java private ConsumerFactory ConsumerFactory(字符串groupId){ Map props=newhashmap(); ...

我明白,要使一个方法成为Kafka消息侦听器的目标,我必须用@KafkaListener注释来标记这个方法。 此注释允许通过containerFactory元素指定KafkaListenerContainerFactory

下面是Baeldung Spring Kafka教程的一些片段

KafkaConsumerConfig.java

private ConsumerFactory ConsumerFactory(字符串groupId){
Map props=newhashmap();
...
返回新的默认卡夫卡消费工厂(道具);
}
私有ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(字符串组ID){
ConcurrentKafkalistener集装箱工厂=
新的ConcurrentKafkaListenerContainerFactory();
setConsumerFactory(consumerFactory(groupId));
返回工厂;
}
@豆子
public ConcurrentKafkaListenerContainerFactory食品KafkalistenerContainerFactory(){
返回kafkaListenerContainerFactory(“foo”);
}
MessageListener.java

@KafkaListener(
topics=“${message.topic.name}”,
groupId=“foo”,
containerFactory=“fooKafkaListenerContainerFactory”)
public void listenGroupFoo(字符串消息){
System.out.println(“组'foo'中收到的消息:“+消息”);
...
}
我不明白的是为什么我们需要一个侦听器容器工厂。什么是侦听器容器?以这种方式注释方法会发生什么?

侦听器“容器”是一个跨越多种技术(JMS、RabbitMQ、Kafka、AWS等)的Spring概念

监听器被定义为POJObean方法,是容器的属性(容器“包含”监听器)

容器负责与代理进行交互以接收消息,并根据侦听器类型对每条消息或一批消息调用侦听器方法

这意味着您的应用程序代码不必处理与代理交互的机制,您可以只关注您的业务逻辑


框架会发现任何
@KafkaListener
方法,并使用工厂为每个方法创建一个容器。

谢谢回复。我可以说,在高层次上,容器创建对应于为消费者注册特定主题的侦听器吗;但同时性起了作用;如果您的主题有多个分区,并且容器并发性大于1,那么您将获得一定数量的使用者,这些使用者可以使用订阅分区中的记录并发调用侦听器。在本例中,我们有一个
ConcurrentMessageListenerContainer
n
“child”
KafCamessageListenerContainer
s,但它们都调用同一个侦听器实例。现在已经清楚了。然而,我注意到另一件事。如果我将相同的
@KafkaListener
注释(相同的主题和相同的groupId)放在两个不同的方法上,我注意到只有后者被调用。第二个方法上的注释似乎“隐藏”了第一个方法。这只是关于随意性,或者是有原因的?如果主题只有一个分区,就会发生这种情况-卡夫卡只允许每个分区有一个消费者,除非他们在不同的组中。当只有一个分区时,将创建第二个使用者,但将为其分配0个分区—您可以在日志中看到这一点。