spring-kafka入门学习(五):spring-kafka事务

一、前言

spring-kafka提供了两种事务的实现方式

1.使用SpringBoot的注解@Transactional

2.本地事务KafkaTemplate

二、@Transactional

修改生产者的配置,开启事务支持

 @Bean
    public ProducerFactory<Integer, String> producerFactory() {
        DefaultKafkaProducerFactory<Integer, String> factory = new DefaultKafkaProducerFactory<>(producerConfigs());
        factory.setTransactionIdPrefix("trans-");//支持事务
        return factory;
    }
    @Bean
    KafkaTransactionManager kafkaTransactionManager() {
        return new KafkaTransactionManager(producerFactory());
    }

接口

    @RequestMapping(value = "test3")
    @Transactional
    public String test3() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        kafkaTemplate.send("topic_transaction_test", 0, "事务测试数据" + sdf.format(new Date()));
        kafkaTemplate.flush();
        throw new RuntimeException("a");
//        return "test";
    }

三、本地事务KafkaTemplate

修改生产者的配置,开启事务支持(只设置这个就可以)

    @Bean
    public ProducerFactory<Integer, String> producerFactory() {
        DefaultKafkaProducerFactory<Integer, String> factory = new DefaultKafkaProducerFactory<>(producerConfigs());
        factory.setTransactionIdPrefix("trans-");//支持事务
        return factory;
    }

本地事务的使用

        kafkaTemplate.executeInTransaction(new KafkaOperations.OperationsCallback() {
            @Override
            public Object doInOperations(KafkaOperations kafkaOperations) {
                kafkaOperations.send("topic_transaction_test", 0, "事务测试数据" + sdf.format(new Date()));
                throw new RuntimeException("a");
//                return true;
            }
        });

猜你喜欢

转载自blog.csdn.net/cs373616511/article/details/106099834