首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在spring引导应用程序中用spring事务配置kafka事务管理器

如何在spring引导应用程序中用spring事务配置kafka事务管理器
EN

Stack Overflow用户
提问于 2021-12-28 12:54:42
回答 1查看 3.3K关注 0票数 3

我在春季引导应用程序中使用Kafka。我想在一个事务中执行操作,如下所示。

代码语言:javascript
复制
listen(){
 produce()
 saveInDb()
} 

代码语言:javascript
复制
operation(){
 saveInDB()
 produce()
}

我已经使用以下配置启用了Kafka事务

代码语言:javascript
复制
spring:
  kafka:
    bootstrap-servers: localhost:19092,localhost:29092,localhost:39092
    producer:
      transaction-id-prefix: tx-
    consumer:
      enable-auto-commit: false
      isolation-level: read_committed

并使用此配置

代码语言:javascript
复制
    @Bean
    public ProducerFactory<String, Object> producerFactory() {
        Map<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
        DefaultKafkaProducerFactory<String, Object> factory = new DefaultKafkaProducerFactory<>(props);
        factory.setTransactionIdPrefix("tx-");
        return factory;
    }

    @Bean
    public KafkaTransactionManager kafkaTransactionManager() {
        KafkaTransactionManager manager = new KafkaTransactionManager(producerFactory());
        return manager;
    }
    @Bean
    public KafkaTemplate<String, Object> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }

但是,当我尝试使用spring @Transactional注释时,会出现一个错误。

代码语言:javascript
复制
@Transactional
operation(){
 saveInDB()
 produce()
} 
代码语言:javascript
复制
No bean named 'transactionManager' available: No matching TransactionManager bean found for qualifier 'transactionManager' - neither qualifier match nor bean name match!

我跟着春天的医生来了,https://docs.spring.io/spring-kafka/reference/html/#using-kafkatransactionmanager

我在配置中遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-03 16:53:38

我没有在配置中定义transactionManager bean。Spring无法找到它,因为KafkaTransactionManager扩展了AbstractPlatformTransactionManagerJpaTransactionManager也扩展了同一个类。

将这个bean定义为主bean解决了这个问题。

代码语言:javascript
复制
    @Bean
    @Primary
    public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

Kafka事务与它链接在一起,KafkaTemplate将事务与事务管理器同步。

参考https://docs.spring.io/spring-kafka/reference/html/#transactions

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70507373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档