下面是我们的
IntegrationFlow
,请建议如何为涉及的2个数据库实现两阶段提交或尽力一阶段提交。谢谢
MQ
适配器 --> Jpa.updatingGateway
(db1) & Jpa.updatingGateway
(db2)
db1 和 db2 操作应该一起提交或回滚
对于两个不同的数据库(我假设也适用于 MQ),您需要使用
org.springframework.transaction.jta.JtaTransactionManager
。由您和您的环境决定如何获取 XA 事务:从 IBM WebSphere 等应用程序服务器获取 JNDI 或使用 Atomikos。
然后,您将 JMS 入站端点配置为使用该事务管理器,并且所有下游流都将参与其中(如果它与直接通道连接)。
您的两个
Jpa.updatingGateway()
可以订阅同一个PublishSubscribeChannel
,或者您可以使用一个routeToRecipients()
。
例如:
@Bean
public IntegrationFlow jmsMessageDrivenRedeliveryFlow() {
return IntegrationFlow
.from(Jms.messageDrivenChannelAdapter(mqFactory)
.destination("myQueue")
.configureListenerContainer(c -> c.transactionManager(jtaTransactionManager)))
.publishSubscribeChannel(publishSubscribeSpec -> publishSubscribeSpec
.subscribe(subFlow1 -> subFlow1.handle(Jpa.updatingGateway(db1)))
.subscribe(subFlow2 -> subFlow2.handle(Jpa.updatingGateway(db2))))
.get();
}