Spring integration 访问分页http资源的集成流
我试图完全使用分页资源,如下所示,但是我的aproach引发了StackOverflowException。 有线索吗?还是另一种说法Spring integration 访问分页http资源的集成流,spring-integration,Spring Integration,我试图完全使用分页资源,如下所示,但是我的aproach引发了StackOverflowException。 有线索吗?还是另一种说法 示例:确定。我现在明白了。让我简化您的递归代码以显示问题: private IntegrationFlow getPageFlow() { return f -> f .publishSubscribeChannel(ps -> ps .subscrib
示例:确定。我现在明白了。让我简化您的递归代码以显示问题:
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集成中的头等公民,尽管如此,我通常更喜欢将流连接到流的更“类型安全”的方法(例如:路由器中的子流映射而不是通道映射)。非常感谢。您仍然可以通过返回通道的方法保持“类型安全”。但我明白你的意思。不幸的是,若我们只是从方法中调用方法并返回,那个么就并没有能力停止声明递归。