【发布时间】:2020-05-14 10:54:46
【问题描述】:
我有很多事务型消费者,它们的 ChainedKafkaTransactionManager 基于 JpaTransactionManager 和 KafkaTransactionManager(全部为 @KafkaListener)。
JPA 需要设置一个 ThreadLocal 变量,以便能够知道要连接到哪个 DB(是租户 ID)。
在启动应用程序时,在onPartitionsAssignedlistener中,spring-kafka 正在尝试创建链式 txn,因此尝试创建 JPA txn,但没有设置租户,然后失败。
该租户是通过 http 过滤器和/或 kafka 拦截器(通过事件标头)设置的。
我尝试将自动连接的KafkaListenerEndpointRegistry 与setAutoStartup(false) 一起使用,但我看到消费者没有收到任何事件,可能是因为它们尚未初始化(我认为它们是按需初始化的)。
如果我设置一个模拟租户 ID 并在应用程序准备好时调用 registry.start(),初始化似乎是在其他线程中完成的(可能是因为我使用的是 ConcurrentKafkaListenerContainerFactory),所以它不起作用。
有没有办法避免初始 onPartitionsAssigned 侦听器上的 JPA 事务,这是消费者初始化的一部分?
【问题讨论】:
-
不清楚你的意思。收到记录时最终将调用侦听器的同一线程首先调用
onPartitionsAssigned()。如果没有为此设置 TL,那么在调用侦听器时也不会设置。什么设置了 TL,什么时候? -
我编辑了这个问题,试图更清楚。理想情况下,我希望在没有 JPA 的情况下完成消费者初始化,并使用链式 txn 管理器进行正常的 pub/sub。
标签: apache-kafka spring-transactions spring-kafka