使用 releaseStrategy 但流程不会继续

Using releaseStrategy but flow doesn't continue

我使用的主要流程如下

    return flow -> flow.channel(REQUEST_INPUT)
            ...
            .enrich(this::calculationEnricher)
            .route(ifMLCallRequired(), routeToMLOrBypassCall())
            .enrich(this::subServiceRequestEnricher)
            ....

和以下子流

Consumer<RouterSpec<Boolean, MethodInvokingRouter>> routeToMLOrBypassCall() {
    return rs -> rs.resolutionRequired(false)
            .subFlowMapping(true, sf -> sf
                .enrichHeaders(he -> he.headerExpression("corrMLCalls", "T(java.util.UUID).randomUUID().toString()"))
                .scatterGather(rlr -> rlr.applySequence(true)
                                         .recipientFlow(f1 -> f1
                                                .channel(c -> c.executor(executorMLCalls))
                                                .route(ifService1NeedsToBeCalled(), routeToService1OrBypassCall()))
                                         .recipientFlow(f2 -> f2
                                                .channel(c -> c.executor(executorMLCalls))
                                                .enrich(this::service2RequestEnricher)
                                                .enrich(this::service2Enricher))
                                         .recipientFlow(f3 -> f3
                                                .channel(c -> c.executor(executorMLCalls))
                                                .enrich(this::service3RequestEnricher)
                                                .enrich(this::service3Enricher)),
                               agg -> agg.correlationStrategy(msg -> msg.getHeaders().get("corrMLCalls"))
                                         .releaseExpression("size() == 2"),
                               sgs -> sgs.gatherTimeout(gatherTimeout)
                                         .requiresReply(true)
                )
                .handle(...
                )
                .defaultOutputToParentFlow();
}

service2 和 service3 总是被调用,但 service1 取决于某些条件。如果服务 1 没有被调用(即 size() == 2),那么我遇到了一个奇怪的现象(好吧,至少这对我来说很奇怪......):在 routeToMLOrBypassCall() 之后 subServiceRequestEnricher应该被调用但它不是。仅当我将释放条件更改为 size() == 3 时。我认为这与我为每个服务创建了 3 个频道并且它期望从每个服务中得到一些东西有关吗?

routeToService1OrBypassCall()长得像

Consumer<RouterSpec<Boolean, MethodInvokingRouter>> routeToService1OrBypassCall()() {
    return rs -> rs.resolutionRequired(false)
            .subFlowMapping(false, sf -> sf.enrich(this::service1RequestEnricher)
                                           .enrich(this::service1Enricher)
            )
            .defaultOutputToParentFlow();
}

我是否也应该向 true 分支添加一些内容...?

感谢您的帮助!谢谢!

此致,V.

你的逻辑太复杂了,很难理解这样的子流程配置是怎么回事。

您可能需要考虑将路由器逻辑替换为简单的 .filter()。那个人可以在 true 上回复并且不会在 false.

上做任何事情

路由器有它的缺点,它不会按原样产生到回复通道,它只是在它路由到的子流中结束。