Transaction Synchronization in Spring Kafka

前端 未结 2 1869
夕颜
夕颜 2020-12-04 22:39

I want to synchronize a kafka transaction with a repository transaction:

@Transactional
public void syncTransaction(){
  myRepository.save(someObject)
  kafka         


        
2条回答
  •  隐瞒了意图╮
    2020-12-04 23:13

    @Eike Behrends to have a db + kafka transaction, you can use ChainedTransactionManager and define it this way :

    @Bean
    public KafkaTransactionManager kafkaTransactionManager() {
        KafkaTransactionManager ktm = new KafkaTransactionManager(producerFactory());;
        ktm.setTransactionSynchronization(AbstractPlatformTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
        return ktm;
    }
    
    
    @Bean
    @Primary
    public JpaTransactionManager transactionManager(EntityManagerFactory em) {
        return new JpaTransactionManager(em);
    }
    
    @Bean(name = "chainedTransactionManager")
    public ChainedTransactionManager chainedTransactionManager(JpaTransactionManager jpaTransactionManager,
                                                               KafkaTransactionManager kafkaTransactionManager) {
        return new ChainedTransactionManager(kafkaTransactionManager, jpaTransactionManager);
    }
    

    You need to annotate your transactional db+kafka methods @Transactional("chainedTransactionManager")

    (you can see the issue on spring-kafka project : https://github.com/spring-projects/spring-kafka/issues/433 )

    You say :

    From my perspective it looks weird that I send an event via kafkaTemplate, listen to my own event and forward the event using the kafkaTemplate again.

    Have you tried this ? If so can you provide an example please ?

提交回复
热议问题