我用的是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
方法而不使用注解,它就可以按照我的要求工作,但是有什么方法可以使用注解吗?
1条答案
按热度按时间ztyzrc3y1#
要使
@Transactional
与KafkaTransactionManager
和KafkaTemplate
一起工作,必须在KafkaTransactionManager
和KafkaTemplate
上配置相同的ProducerFactory
。文档在事务部分的开头明确指出:https://docs.spring.io/spring-kafka/reference/html/#using-kafkatransactionmanager。您必须配置
KafkaTemplate
以使用与事务管理器相同的ProducerFactory
。