kafka对于事务的支持(0.11.0.0客户端库开始添加了对事务的支持,kafka针对于事务机制新增名为 __transaction_state topic用以保存数据):
-
KafkaTransactionManager
:与spring提供的事务机制一起使用(@Transactional
,TransactionTemplate
等等)。 -
使用
KafkaMessageListenerContainer 事务性监听容器(消费者保证消费
Exactly Once仅消费处理一次)
-
使用KafkaTemplate
如果需要开启事务机制,使用默认配置需要在yml添加spring.kafka.producer.transaction-id-prefix配置。
或者自己初始化bean在上述KafkaProducerConfigure中添加
/**
* 构建生产者工厂类
*/
@Bean
public ProducerFactory<Integer, String> producerFactory() {
Map<String, Object> configs = producerConfigs();
DefaultKafkaProducerFactory<Integer,String> producerFactory = new DefaultKafkaProducerFactory(configs,new IntegerSerializer(),new StringSerializer());
//设置事务Id前缀 开启事务
producerFactory.setTransactionIdPrefix("tx-");
return producerFactory;
}
@Bean
public KafkaTransactionManager<Integer, String> kafkaTransactionManager(ProducerFactory<Integer, String> producerFactory) {
return new KafkaTransactionManager<>(producerFactory);
}
将KafkaTransactionManager注入到spring中。如果开启的事务,则后续发送消息必须使用@Transactional注解或者使用kafkaTemplate.executeInTransaction() ,否则抛出java.lang.IllegalStateException: No transaction is in process; possible solutions: run the template operation within the scop