Spring 集成:递归流?

Spring Integration: Recursive Flow?

我是 Spring/Spring 集成的新手,我无法理解如何正确实施允许可变数量的出站网关调用的流程。

问题: 给定一个 customer-id,我进行一次出站网关调用以获取相关客户列表。对于这些相关客户中的每一个,我都需要进行另一个出站网关调用。

我的初始方法:第一次服务调用后,我用接收到的相关-customer-id填充一个Queue,调用一个辅助方法来轮询 queue,然后通过再次调用出站网关继续流程以执行下一个请求(仅当有客户离开时)。收到响应后,网关会调用相同的辅助方法,重复该过程。

如果 queue 为空,则使用 header 将流路由到辅助方法中的 logAndReply(代码见下文)。

private IntegrationFlow helperMethod()
{
    return flow -> flow

        .transform(payload -> {
            currentCust = info.poll();
            return payload;
        })

        //check if there is another related-customer to process
        .handle(
                (payload, headers) -> MessageBuilder
                        .withPayload(payload)
                        .copyHeaders(headers)
                        .setHeader("relatedCustomerLeft", (null == currentCust ? Boolean.FALSE : Boolean.TRUE))
                        .build()
        )
        .route(("headers['relatedCustomerLeft']"), route -> route

                //if no more related-customers, end the flow
                .subFlowMapping(Boolean.FALSE,
                        subFlow -> subFlow
                            .logAndReply(LoggingHandler.Level.INFO, "end of base case")
                )
                //if there is a related customer, call the gateway
                .subFlowMapping(Boolean.TRUE,
                        subGateway()
                )
        );
}

这里,subGateway() 只是 returns 另一个处理出站服务调用的 IntegrationFlow。当我删除递归调用时,此逻辑似乎有效。但是,包括递归调用会导致启动时出现堆栈溢出错误。日志只是一遍又一遍地显示 "Creating SAAJ 1.3 MessageFactory with SOAP 1.1 Protocol" ,直到发生堆栈溢出。

"Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getFlow' defined in file [GetFlow.class]: Initialization of bean failed; nested exception is java.lang.WhosebugError"

我的问题是

  1. 为什么会出现栈溢出?
  2. 递归甚至可以按照我尝试使用的方式使用吗?如何正确实施?
  3. 是否有更好的方法来进行可变数量的网关调用?有什么例子吗?

正如我所说,我还是新手,所以任何提示或资源也将不胜感激。

首先,您没有展示如何创建该递归,其次,您根本不清楚为什么在您的用例中需要递归。

听起来你需要 enrich() "to get a list of related customers"。 然后,您需要 split() 针对返回的客户列表来为每个客户调用服务。对我来说似乎就是这样!不需要任何递归。

我还会考虑在 split() 之前添加一个 filter() 以确保列表不为空。或者 route() 因为你已经...

但仍然不清楚递归会在哪里弹出...