Apache kafka 弹簧卡夫卡不能正常关闭

Apache kafka 弹簧卡夫卡不能正常关闭,apache-kafka,spring-kafka,Apache Kafka,Spring Kafka,我已将并发性为3的ConcurrentMessageListenerContainer配置为从3个分区使用,还将KafkaTemplate配置为生产消息到3个分区的producerFactory。Springbean配置了destroy方法,以便在应用程序关闭时调用使用者侦听器容器和生产者的stop()。关机后,日志如下所示,看起来消费者已经停止,但没有生产者是否停止的信息 [kafkaContainer-0-C-1]INFO org.springframework.kafka.listener

我已将并发性为3的
ConcurrentMessageListenerContainer
配置为从3个分区使用,还将
KafkaTemplate
配置为生产消息到3个分区的producerFactory。Springbean配置了destroy方法,以便在应用程序关闭时调用使用者侦听器容器和生产者的
stop()
。关机后,日志如下所示,看起来消费者已经停止,但没有生产者是否停止的信息

[kafkaContainer-0-C-1]INFO org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer-消费者已停止
[kafkaContainer-2-C-1]INFO org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer-消费者已停止
[kafkaContainer-1-C-1]INFO org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer-消费者已停止

但应用程序并没有完全关闭。执行jstack命令时,3 ThreadPoolTaskScheduler仍在后台运行。jstack命令的输出片段:

“ThreadPoolTaskScheduler-1”#74优先级=5 os_优先级=0 tid=0x00007f8564f23800 nid=0x77e5等待条件[0x00007f8525292000] java.lang.Thread.State:等待(停车) 在sun.misc.Unsafe.park(本机方法) -停车等待(java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 位于java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081) 位于java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) 位于java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 运行(Thread.java:745)

上面的块是为每个MessageListener打印的,我的意思是如果我将并发性设置为5,那么jstack输出将包含上面的消息5次。所以我认为,即使消费者监听器被记录为shutdown,它在内部也不会完全关闭


我遗漏了一些关于正确关闭生产者和消费者的信息?

你没有说你正在使用哪个版本

这在2.1.0、2.0.2和1.3.2中是固定的


您不需要从
destroy()
方法中
stop()
容器;上下文将在消费者关闭时停止它。

酷,我使用的是1.3.1。升级到1.3.2修复了该问题。我将尝试升级到更新的版本。谢谢。如果你手头有,请发布与该bug相关的链接,只是想了解更多关于该bug的信息。如果没有,那没关系:)我们将调度程序添加到一个bug中,该bug是由一个社区成员提交的。