该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用 Spring for Apache Kafka 4.0.0spring-doc.cadn.net.cn

线程安全

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

  • n容器并发=1配备瞄准镜原型机消息监听器因此每个容器都有自己的实例(在使用@KafkaListener).spring-doc.cadn.net.cn

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

  • 让单例监听者委托给被声明为 的SimpleThreadScope(简易线程镜)(或类似的瞄准镜)。spring-doc.cadn.net.cn

为了方便清理线程状态(针对前一列表中的第二和第三项),从版本 2.2 开始,监听器容器发布ConsumerStoppedEvent每当每个线程退出时。 你可以用ApplicationListener@EventListener移除方法ThreadLocal<?>实例或移除()Thread-Scoped豆子来自示波器。 注意SimpleThreadScope(简易线程镜)不会破坏具有破坏界面的豆子(例如一次性豆),所以你应该这样做摧毁()你自己。spring-doc.cadn.net.cn

默认情况下,应用上下文的事件多播器会调用调用线程上的事件监听器。 如果你把多播器改成异步执行器,线程清理就没效果了。

关于虚拟线程和并发消息监听器容器的特别说明

由于底层库类的某些限制,仍然使用同步用于线程协调的模块,应用程序在使用带有并发消息监听器容器的虚拟线程时需要谨慎。 当启用虚拟线程时,如果并发超过可用平台线程数,虚拟线程很可能会被钉在平台线程上,并可能出现竞态条件。 因此,随着 Spring for Apache Kafka 使用的第三方库不断完善以完全支持虚拟线程,建议保持消息监听器容器上的并发值等于或小于平台线程数。 这样,应用程序可以避免线程与被钉在平台线程上的虚拟线程之间的竞态条件。spring-doc.cadn.net.cn