【发布时间】:2020-07-23 07:52:25
【问题描述】:
是否有可能将声明性 tx 管理(通过 @Transactional)与 @KafkaListener 注释方法一起使用? 例如,我想使用它来为每个侦听器定义单独的 tx 超时。 我的设置如下:
事务管理器:
@Bean
@ConditionalOnBean(value = {HibernateTransactionManager.class})
public ChainedKafkaTransactionManager<Object, Object> chainedHibernateTm(KafkaTransactionManager<String, String> kafkaTransactionManager,
org.springframework.orm.hibernate5.HibernateTransactionManager hibernateTransactionManager) {
return new ChainedKafkaTransactionManager<>(
kafkaTransactionManager,
hibernateTransactionManager);
}
KafkaListener:
@KafkaListener(topic = "my_topic")
@Transactional(timeout = 5)
public void handleMessage(SomeMessage message){
}
问题是 - KafkaMessageListenerContainer 在调用此类方法之前创建自己的事务 - 它使用自己的 TransactionTemplate:
@Nullable
private TransactionTemplate determineTransactionTemplate() {
return this.transactionManager != null
? new TransactionTemplate(this.transactionManager)
: null;
}
不使用 TransactionInterceptor。那么如何为具体的@KafkaListener 方法设置特定的 tx 超时呢?
【问题讨论】:
标签: java spring-boot spring-kafka spring-transactions