我正在将Spring (MVC)应用程序转换为反应性编程(Spring )
为了进行外部rest调用,我使用了WebClient。
List<String> targetUrls = Arrays.asList("one","two","three");
int iteration = 1;
for(String target:targetUrls){
// make a rest call here
// if 200 break the loop
// else loop continues
}
剩下的电话在这里返回一个Mono。
是否有一种方法可以迭代urls列表(在本例中)并根据某些响应中断循环
在Mono上尝试使用flatMap,基于响应可以对另一个url ->进行rest调用,以防我们在掌握url数量之前知道它。
发布于 2022-06-21 14:25:17
我不知道如何从WebClient调用URL,但假设URL被传递给WebClient.get(String url)
方法,我将继续这个示例。
这些步骤有点像您将首先获得一个URL的通量,然后使用flatMap
(因为您的响应是一个Mono),然后对这些URL使用map
。
Flux.fromIterable(targetUrls)
.flatMap(webClient::get)
.map(response -> doSomethingWith(response))
现在你应该有很多回应了。如果来自WebClient的错误处理还不够,您也可以在中间插入一些内容。
Flux.fromIterable(targetUrls)
.flatMap(webClient::get)
.doOnError(errorHandler::handle)
.map(response -> doSomethingWith(response))
发布于 2022-06-21 15:09:09
您可以应用几种模式来实现此逻辑。
您可以使用flatMap
并发执行多个查询。默认情况下,flatMap
将处理飞行中内部序列的Queues.SMALL_BUFFER_SIZE = 256
数.
Flux.fromIterable(targetUrls)
.flatMap(url -> webClient.get(url))
.map(response -> process(response))
如果要按顺序执行查询,可以控制并发性flatMap(url -> webClient.get(url), concurrency)
或使用concatMap
运算符。
如果您需要响应来决定下一个请求,另一个有用的模式是使用expand
操作符。例如,在分页请求的情况下。
webclient.get(url)
.expand(response -> {
if (<should stop>) {
// stop the loop
return Mono.empty();
}
return webclient.get(url);
});
https://stackoverflow.com/questions/72701742
复制相似问题