Spring 集成 - DSL - 拆分或分叉

Spring Integration - DSL - Split or Fork

我想为以下流程创建 IntegrationFlow 流程。

  1. 从开始到交付是同步流程。
  2. 如何从构建项和验证项中提取/分叉异步结束节点。

 @Bean
 public IntegrationFlow buildCart() {
  return f -> f.handle(validate, "buildPreCheck")
.handle(preProcessProcessor)
.handle(getOffersProcessor)
.handle(buildItems)
**.wireTap(log())**
.handle(validateItems)
.handle(deliver);
 }

编辑:

您好 Artem,我在下面的代码中添加了 Wire Tap。仍然将 WireTap 节点作为 Sequencal 执行并等待该节点。

请帮助使其成为Aysnc节点。

@Bean
public IntegrationFlow log() {
    return f -> f.handle(auditProcessor).channel("nullChannel");
}



@ServiceActivator
@Description("Call and get the Offers Request")
public void getDetails(Message<Context> message) throws InterruptedException {
    log.info("getDetails-Sleep-Start");
    Thread.sleep(3000);
    log.info("getDetails-Sleep-End");
}

对于 Spring 集成 Java DSL,我们都缺少 Spring 集成中非常重要的组件之一是 MessageChannel。事实上,只要我们需要超过默认值 DirectChannel,就可以将通道添加到流中。对于异步执行,我们有一个 ExecutorChannel。但是在我们开始分叉流程之前,我们需要以某种方式跳到那里而不破坏主要流程。就 EIP 而言,这称为 Wire-Tap:https://www.enterpriseintegrationpatterns.com/patterns/messaging/WireTap.html.

Spring 集成 Java DSL 建议在流程中采用类似 .wireTap() 运算符的实现。审计逻辑可以在 tapped 子流或通道中实现,但不要忘记 ExecutorChannel

您可以在参考手册中查看更多信息:https://docs.spring.io/spring-integration/reference/html/java-dsl.html#java-dsl-wiretap

更新

.handle(buildItems)
.wireTap(log())

是正确的方法:您将审核 buildItems 的结果并继续下一步。

log()必须这样修改:

@Bean
public IntegrationFlow log() {
    return f -> f.channel(c -> c.executor(taskExecutorBean())).handle(auditProcessor).channel("nullChannel");
}

关注c.executor()。通过这种方式,我们为 log() 子流程添加了异步切换。