0

我必须编写一个返回的函数CompletionStage<Void>。该函数可以查询分页数据(异步操作,返回包裹在中的数据CompletionStage)并处理它们并查询下一组数据,直到它处理完整个数据集。有没有一种方法可以在不使用连接的情况下在完成阶段使用 while 循环?

public CompletionStage<Void> process(Input){
    while(allDataProcessed){
       queryDataAndProcess(This itself is async function)
    }
}
4

1 回答 1

0
public CompletionStage<Void> process(Input) {
     CompletableStage<Void> loop = CompletableFuture.completedFuture(null);
     while(allDataProcessed) {
        loop = loop.thenCompose( unusued -> queryDataAndProcess(...) );
     }
     return loop;
}

此解决方案的缺点是它可能会在内存中创建许多对象。为避免此问题,您可以使用IBM async utils

public CompletionStage<Void> process(Input) {
    return AsyncTrampoline.asyncWhile( () -> 
        queryDataAndProcess(...).thenApply( r -> allDataProcessed )
    )
}

使用 Maven,您可以将其添加到您的项目中:

<dependency>
    <groupId>com.ibm.async</groupId>
    <artifactId>asyncutil</artifactId>
    <version>0.1.0</version>
</dependency>

这个库实现了Trampoline 模式

于 2021-04-01T15:09:10.207 回答