首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将传统的java for循环逻辑替换为使用spring和webclient的反应性编程。

将传统的java for循环逻辑替换为使用spring和webclient的反应性编程。
EN

Stack Overflow用户
提问于 2022-06-21 13:34:14
回答 2查看 446关注 0票数 0

我正在将Spring (MVC)应用程序转换为反应性编程(Spring )

为了进行外部rest调用,我使用了WebClient。

代码语言:javascript
运行
复制
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数量之前知道它。

EN

回答 2

Stack Overflow用户

发布于 2022-06-21 14:25:17

我不知道如何从WebClient调用URL,但假设URL被传递给WebClient.get(String url)方法,我将继续这个示例。

这些步骤有点像您将首先获得一个URL的通量,然后使用flatMap (因为您的响应是一个Mono),然后对这些URL使用map

代码语言:javascript
运行
复制
Flux.fromIterable(targetUrls)
  .flatMap(webClient::get)
  .map(response -> doSomethingWith(response))

现在你应该有很多回应了。如果来自WebClient的错误处理还不够,您也可以在中间插入一些内容。

代码语言:javascript
运行
复制
Flux.fromIterable(targetUrls)
  .flatMap(webClient::get)
  .doOnError(errorHandler::handle)
  .map(response -> doSomethingWith(response))
票数 0
EN

Stack Overflow用户

发布于 2022-06-21 15:09:09

您可以应用几种模式来实现此逻辑。

您可以使用flatMap并发执行多个查询。默认情况下,flatMap将处理飞行中内部序列的Queues.SMALL_BUFFER_SIZE = 256数.

代码语言:javascript
运行
复制
Flux.fromIterable(targetUrls)
  .flatMap(url -> webClient.get(url)) 
  .map(response -> process(response))

如果要按顺序执行查询,可以控制并发性flatMap(url -> webClient.get(url), concurrency)或使用concatMap运算符。

如果您需要响应来决定下一个请求,另一个有用的模式是使用expand操作符。例如,在分页请求的情况下。

代码语言:javascript
运行
复制
webclient.get(url)
        .expand(response -> {
            if (<should stop>) {
                // stop the loop
                return Mono.empty();
            }

            return webclient.get(url);
        });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72701742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档