集成流访问分页的http资源

时间:2017-08-18 14:57:40

标签: spring-integration

我正在尝试完全使用分页资源,但是我的aproach正在引发StackOverflowException。 这个有什么线索吗?还是一个不同的方法?

示例:https://gist.github.com/daniel-frank/a88fa4553ed34c348528f51d33c3733b

1 个答案:

答案 0 :(得分:1)

行。我现在明白了。让我简化你的递归代码来显示问题:

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

我认为你的方法中存在的问题是缺少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");
    }

当然你仍然有一个递归,但这已经在运行时,合乎逻辑。