对于最新稳定版本,请使用Spring for Apache Kafka 4.0.4spring-doc.cadn.net.cn

线程安全

当使用并发消息监听器容器时,一个监听器实例会被所有消费者线程调用。 监听器因此需要是线程安全的,最好使用无状态监听器。 如果无法使您的监听器线程安全,或者添加同步会显著降低并发带来的好处,您可以使用以下几种技术之一:spring-doc.cadn.net.cn

  • 使用 n 容器与 concurrency=1 配合,并使用原型作用域的 MessageListener 组件bean,使得每个容器都获得自己的实例(这在使用 @KafkaListener 时是不行的)。spring-doc.cadn.net.cn

  • ThreadLocal<?> 实例中保持状态。spring-doc.cadn.net.cn

  • 具有单例作用域的监听器委托到在SimpleThreadScope中声明的bean(或类似的作用域)。spring-doc.cadn.net.cn

To facilitate cleaning up thread state (for the second and third items in the preceding list), 自版本 2.2 起,监听器容器在每个线程退出时发布一个 ConsumerStoppedEvent。 您可以使用 ApplicationListener@EventListener 方法移除 ThreadLocal<?> 实例或 remove() 个线程作用域的 bean。 请注意,SimpleThreadScope 不会销毁具有销毁接口(如 DisposableBean)的 bean,因此您应 destroy() 该实例 yourself。spring-doc.cadn.net.cn

默认情况下,应用程序上下文的事件多播器会在调用线程上触发事件监听器。 如果你将多播器更改为使用异步执行器,线程清理将不再生效。