Spring Boot Kafka事务疑问:KafkaTransactionManager未注入及Jpa日志问题
Spring Boot Kafka事务实现中的异常现象与疑问
1. KafkaTransactionManager未自动注入
我们在自定义配置类KafkaProducerConfiguration中为ProducerFactory配置了ProducerConfig.TRANSACTIONAL_ID_CONFIG = "transaction-",但KafkaAutoConfiguration中负责创建KafkaTransactionManager的Bean并未自动生成。查看自动配置逻辑:
@Bean @ConditionalOnProperty( name = {"spring.kafka.producer.transaction-id-prefix"} ) @ConditionalOnMissingBean public KafkaTransactionManager<?, ?> kafkaTransactionManager(ProducerFactory<?, ?> producerFactory) { return new KafkaTransactionManager(producerFactory); }
可以看到该Bean的创建条件是存在spring.kafka.producer.transaction-id-prefix配置且无自定义KafkaTransactionManagerBean。这说明spring.kafka.producer.transaction-id-prefix与ProducerConfig.TRANSACTIONAL_ID_CONFIG并非同一配置,且我们在ProducerConfig中未找到对应spring.kafka.producer.transaction-id-prefix的常量。
2. 日志中出现JpaTransactionManager
在带有@Transactional注解的TestService方法中调用kafkaTemplate.send()时,日志显示JpaTransactionManager在处理事务提交,但事务却成功执行。相关代码如下:
@AllArgsConstructor @Service public class TestService { private final KafkaTemplate<Long, Message> kafkaTemplate; @Transactional public void test(Long id, Message message){ kafkaTemplate.send("topic", id, message); } }
日志片段:
15:56:14.406 [http-nio-8081-exec-2] DEBUG o.s.orm.jpa.JpaTransactionManager - Initiating transaction commit 15:56:14.406 [http-nio-8081-exec-2] DEBUG o.s.orm.jpa.JpaTransactionManager - Committing JPA transaction on EntityManager [SessionImpl(1789264984<open>)] 15:56:14.511 [http-nio-8081-exec-2] DEBUG o.s.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [SessionImpl(1789264984<open>)] after transaction
疑问
- 为何
KafkaTransactionManager未被注入,但Kafka事务仍能成功执行? - 为何日志中会出现
JpaTransactionManager而非KafkaTransactionManager?
内容的提问来源于stack exchange,提问作者CostaVi
相关产品推荐
相关产品推荐

