我正在尝试完全使用分页资源,但是我的aproach正在引发StackOverflowException。 这个有什么线索吗?还是一个不同的方法?
示例:https://gist.github.com/daniel-frank/a88fa4553ed34c348528f51d33c3733b
答案 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");
}
当然你仍然有一个递归,但这已经在运行时,合乎逻辑。