我在我的项目中定义了以下集成流程
///
public IntegrationFlow acarsEventFlow() {
return IntegrationFlows
//.from(Jms.messageDrivenChannelAdapter(this.acarsMqListener)) //Get Message from MQ
.from(org.springframework.integration.jms.dsl.Jms.messageDrivenChannelAdapter(
org.springframework.integration.jms.dsl.Jms.container(this.acarsMqConnectionFactory, this.acarsQueue)
.transactionManager(transactionManager(this.acarsMqConnectionFactory))
.get()))
.wireTap(ACARS_WIRE_TAP_CHNL)
.transform(agmTransformer, "parseXMLMessage") //
.handle(acarsProcessor, "pushRawMessage") // (1)Call web service to push the message payload and if it fails then don't commit the transaction and rollback the message
.transform(agmTransformer, "populateSmi")
.filter(acarsFilter,"filterMessageOnSmi") //
.transform(agmTransformer, "populateImi") //
.filter(acarsFilter,"filterMessageOnSmiImi") //
.transform(acarsProcessor,"processEvent") //
.publishSubscribeChannel(pubSub -> pubSub
.subscribe(flow -> flow
.bridge(e -> e.order(Ordered.HIGHEST_PRECEDENCE))
.enrichHeaders(h -> h.headerExpression(KafkaHeaders.MESSAGE_KEY, "payload.flightNbr")) //Add flight number as key
.transform("payload.message") // publish the transformed message
.handle(Kafka.outboundChannelAdapter(kafkaTemplate).topic(acarsKafkaTopic))) //publish to kafka
.subscribe(flow -> flow
.channel(UPDATE_DATA_STORE_CHNL)))
.get();
}
///
我从MQ那里收到一条消息,启动了一个事务管理器,以确保除非处理该消息,否则该消息将回滚。现在,在其中一个处理方法#pushRawMessage()中[请参考注释(1)调用Web服务以在上述片段中推送消息有效负载]我需要调用Web服务。目前,我只是从处理程序内部调用webservice-pushRawMessage()。引入消息传递网关来调用第三方Web服务是一个好主意吗?如果我们引入了mEssaging网关,那么如何确保在Web服务关闭时回滚原始消息?
答案 0 :(得分:0)
可以像现在这样使用它。使用<a href="@Url.Action("Edit", "Dictionary", new { id = Model })">Your link</a>
为该Web服务进程执行一些子流也是很好的。只要所有事情都在同一线程中完成,那么当您仅使用直接通道时,所有事情都将参与同一事务。因此,该子流中的任何错误都将导致事务回滚。
只要您使用.gateway()
,您还可以将该Web服务进程作为 async 。无论如何,它将在当前线程中等待答复或错误。因此,交易将再次回滚。