Spring integration 访问分页http资源的集成流

Spring integration 访问分页http资源的集成流,spring-integration,Spring Integration,我试图完全使用分页资源,如下所示,但是我的aproach引发了StackOverflowException。 有线索吗?还是另一种说法 示例:确定。我现在明白了。让我简化您的递归代码以显示问题: private IntegrationFlow getPageFlow() { return f -> f .publishSubscribeChannel(ps -> ps .subscrib

我试图完全使用分页资源,如下所示,但是我的aproach引发了StackOverflowException。 有线索吗?还是另一种说法


示例:

确定。我现在明白了。让我简化您的递归代码以显示问题:

private IntegrationFlow getPageFlow() {
        return f -> f
                .publishSubscribeChannel(ps -> ps
                         .subscribe(this.nextPageFlow())
                );
    }


private IntegrationFlow nextPageFlow() {
        return f -> f
                .publishSubscribeChannel(ps -> ps
                        .subscribe(this.getPageFlow())
                );
}
因此,从技术上讲,我们在内存中有这样的结构:

getPageFlow
    nextPageFlow
        getPageFlow
           nextPageFlow
               getPageFlow
等等

这里的另一个问题是,每个
.subscribe(this.nextPageFlow())
都会创建一个
IntegrationFlow
的新实例,而逻辑上您只需要一个实例

我知道您不能在
IntegrationFlowAdapter
impl中声明bean,但是
StackOverflowException
无论如何也不能声明bean

我认为您的方法中的一个问题是缺少
MessageChannel
抽象

您可以在任何地方使用
publishSubscribeChannel
,同时您可以通过流中的显式通道定义来区分逻辑

为了打破递归并使代码尽可能接近您的解决方案,我将如下所示:

 private IntegrationFlow getPageFlow() {
        return f -> f
                .channel("pageServiceChannel")
                .handle(Http
                          .outboundGateway("https://jobs.github.com/positions.json?description={description}&page={page}")
 ...

   private IntegrationFlow nextPageFlow() {
        return f -> f
                .filter("!payload.isEmpty()")
                .enrichHeaders(e -> e.headerExpression("page", "headers.getOrDefault('page', 0) + 1", true))
                .channel("pageServiceChannel");
    }

当然,您仍然有一个递归,但它已经在运行时了,符合逻辑

我没有看到任何可疑的东西。也许你可以共享一个堆栈跟踪来确定
堆栈溢出异常的点
?当然!Gist更新了完整的日志文件。我理解。通道是Spring集成中的头等公民,尽管如此,我通常更喜欢将流连接到流的更“类型安全”的方法(例如:路由器中的子流映射而不是通道映射)。非常感谢。您仍然可以通过返回通道的方法保持“类型安全”。但我明白你的意思。不幸的是,若我们只是从方法中调用方法并返回,那个么就并没有能力停止声明递归。