Transaktion Synchronisation im Frühjahr Kafka
Ich möchte zum synchronisieren von kafka Transaktion mit einem repository-Transaktion:
@Transactional
public void syncTransaction(){
myRepository.save(someObject)
kafkaTemplate.send(someEvent)
}
Seit dem merge (https://github.com/spring-projects/spring-kafka/issues/373) und laut dem doc ist dies möglich. Dennoch habe ich Probleme zu verstehen und zu implementieren sind.
Blick auf das Beispiel in https://docs.spring.io/spring-kafka/reference/htmlsingle/#_transaction_synchronization ich habe ein MessageListenerContainer zu hören, um meine eigenen Veranstaltungen.
Muss ich dann trotzdem noch meine Ereignisse mit den KafkaTemplate?
Hat die MessageListenerContainer verbieten das versenden an den Makler?
Und wenn ich das richtig verstehe ist die kafkaTemplate und die kafkaTransactionManager über die Verwendung der gleichen producerFactory, in der ich zum aktivieren der Transaktion Einstellung ein transactionIdPrefix. Und in meinem Beispiel habe ich den TransactionManager der messageListenerContainer der DataSourceTransactionManager. Ist das richtig?
Aus meiner Perspektive sieht es komisch dass ich senden Sie ein Ereignis über kafkaTemplate, hört auf meine eigene Veranstaltung und leitet die Veranstaltung mit dem kafkaTemplate wieder.
Ich würde mir wirklich helfen wenn ich kann ein Beispiel für eine einfache Synchronisation von einem kafka-Transaktion mit einem repository-Transaktion und eine Erklärung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die listener-container bereitgestellt ist mit einer
KafkaTransactionManager
, wird der container zu erstellen, ein Produzent, der dann von downstream-kafka-Vorlage und der container sendet die offsets, um die Transaktion für Sie.Wenn der container einige andere Transaktions-manager, der container kann nicht senden Sie die offsets, da es keinen Zugriff auf den Hersteller (oder Vorlage).
Andere Lösung ist, um kommentieren Sie Ihre Methode mit
@Transactional
(mit der datasource TM) und konfigurieren Sie den container mit einer kafka-TM.Diese Weise, wird Ihre DB tx verpflichten sich, kurz bevor der thread wieder dem container, die dann senden Sie die offsets, um die kafka-Transaktion und übernehmen es.
Sehen der Rahmen Testfälle für Beispiele.
@Eike Behrends eine db - + kafka Transaktion, können Sie
ChainedTransactionManager
und definieren es so :Müssen Sie die Anmerkungen in Ihren Transaktions-db+kafka Methoden
@Transactional("chainedTransactionManager")
(sehen Sie das Problem, auf das Frühjahr-kafka-Projekt : https://github.com/spring-projects/spring-kafka/issues/433 )
Ihnen sagen :
Haben Sie versucht das ? Wenn ja, können Sie ein Beispiel geben, bitte ?