对于最新的稳定版本,请使用 Spring for Apache Kafka 3.3.0! |
线程安全
使用并发消息侦听器容器时,将在所有使用者线程上调用单个侦听器实例。 因此,侦听器需要是线程安全的,最好使用无状态侦听器。 如果无法使侦听器线程安全,或者添加同步会显著降低添加并发的好处,则可以使用以下几种技术之一:
-
用
n
容器concurrency=1
将原型作用域MessageListener
bean 的 Bean 中,以便每个容器都获得自己的实例(这在使用@KafkaListener
). -
保持 state 在
ThreadLocal<?>
实例。 -
让单例侦听器委托给在
SimpleThreadScope
(或类似范围)。
为了便于清理线程状态(对于前面列表中的第二项和第三项),从版本 2.2 开始,侦听器容器会发布一个ConsumerStoppedEvent
当每个线程退出时。
您可以通过ApplicationListener
或@EventListener
删除方法ThreadLocal<?>
instances 或remove()
线程范围的 bean。
请注意,SimpleThreadScope
不会销毁具有销毁接口(例如DisposableBean
),因此您应该destroy()
实例。
默认情况下,应用程序上下文的事件 multicaster 在调用线程上调用事件侦听器。 如果将 multicaster 更改为使用异步执行程序,则线程清理无效。 |