声明多个KafkaTransactionManager时出错

p8h8hvxi  于 2023-04-11  发布在  Apache
关注(0)|答案(1)|浏览(121)

我用的是spring-kafka 2.8.4。
我创建了一个生产者的两个版本,以使用不同的值配置两个生产者,
并声明了KafkaTransactionManager,以配置2个具有不同值的生产者。
我们使用的是JPA。(共3个事务管理器)
我想在默认情况下使用JPA,所以我使用了以下代码。

@Bean
@Primary
fun transactionManager(em: EntityManagerFactory): JpaTransactionManager {
    return JpaTransactionManager(em)
}

为了只使用Kafka事务,而不是JPA,我使用了以下代码。

@Transactional("kafkaStringTransactionManager")
fun send(topic: String, message: String) {
    kafkaTemplate.send(topic, message)
}

您将得到这样的错误
没有正在进行的交易;可能的解决方案:在template.executeInTransaction()操作范围内运行模板操作,在调用模板方法之前使用@Transactional启动事务,在使用记录时由侦听器容器启动的事务中运行。
当只有一个kafkaTransactionManager时,这可以正常工作,
但是当存在多于一个时,存在问题。
如果我使用executeInTransaction方法而不使用注解,它就可以按照我的要求工作,但是有什么方法可以使用注解吗?

ztyzrc3y

ztyzrc3y1#

要使@TransactionalKafkaTransactionManagerKafkaTemplate一起工作,必须在KafkaTransactionManagerKafkaTemplate上配置相同的ProducerFactory。文档在事务部分的开头明确指出:https://docs.spring.io/spring-kafka/reference/html/#using-kafkatransactionmanager。
您必须配置KafkaTemplate以使用与事务管理器相同的ProducerFactory

相关问题