使用 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
.
上做任何事情
路由器有它的缺点,它不会按原样产生到回复通道,它只是在它路由到的子流中结束。
我使用的主要流程如下
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
.
路由器有它的缺点,它不会按原样产生到回复通道,它只是在它路由到的子流中结束。