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;
}
});