AbstractListenerContainerFactory是否应该真正关闭用于检查主题的使用者

时间:2019-04-21 12:03:53

标签: spring-kafka

在org.springframework.kafka.listener.AbstractMessageListenerContainer中,启动容器时,checkTopics方法使用在带有资源块的try中创建的Kafka使用者检查代理上是否存在预订的主题。

当使用者关闭时,闭包将级联为许多可关闭的关联对象,尤其是键和值反序列化器(请参见org.apache.kafka.clients.consumer.KafkaConsumer)。在Spring应用程序中,反序列化器通常被声明为bean,因此每种类型的工厂中只有一个实例,并且尽管大多数反序列化器以无操作方式实现关闭,但我遇到了关闭反序列化器使其无法使用的情况。指向。

在我看来,关闭一个消费者听起来很合理,因为Spring会启动多个实例,而在这里创建的实例只是一个废弃品,而级联到Deserializer Bean是一个不良后果,也许没有注意到编写AbstractMessageListenerContainer时。

有一个解决方法-创建KafkaListenerContainerFactory时,只需调用

factory.getContainerProperties().setMissingTopicsFatal(false);

但是这删除了对主题存在的安全性检查,似乎有点hack。关闭使用者真的是在AbstractMessageListenerContainer中正确的做法吗?

1 个答案:

答案 0 :(得分:0)

我们可以video function 13h使用let homePageProps = {}; if (window.location.pathname === "/") { homePageProps.transparent = "transparent"; } 而不是<MDBNavbar color="elegant-color-dark" dark expand="md" fixed="top" scrolling {...homePageProps}> 来检查主题是否存在。

但是,这不是万能药,因为AdminClient对容器进行操作也会关闭Consumer,因此重新启动容器时也会存在相同的问题。

在这种情况下,最好让Kafka管理解串器的生命周期,而不是将其声明为bean。