当前位置: 首页 > 知识库问答 >
问题:

将传统的java for循环逻辑替换为使用Spring webflow和webClient的反应式编程

宗乐池
2023-03-14

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

为了进行外部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
        }

这里的rest调用返回一个Mono。

有没有一种方法可以遍历URL列表(在本例中是这里),并根据一些响应打破循环

在Mono上尝试过平面图,并根据响应可以对另一个url进行rest调用——

共有2个答案

傅翰池
2023-03-14

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

可以使用 flatMap 同时执行多个查询。默认情况下,flatMap 将处理 Queues.SMALL_BUFFER_SIZE = 256 个正在进行的内部序列。

Flux.fromIterable(targetUrls)
  .flatMap(url -> webClient.get(url)) 
  .map(response -> process(response))

您可以控制并发平面地图(url -

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

webclient.get(url)
        .expand(response -> {
            if (<should stop>) {
                // stop the loop
                return Mono.empty();
            }

            return webclient.get(url);
        });

花高爽
2023-03-14

我不确定你如何从WebClient调用url,但只是假设URL被传递给一个方法WebClient.get(String url),我将继续这个例子。

这些步骤有点像你将首先获得一系列的URL,然后使用< code>flatMap(因为你的响应是单声道的),然后在这些URL上使用< code>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))
 类似资料:
  • 我已经有一段时间没有编程了,我正在努力回到事情的转折点,这就是我已经走了多远。我的问题是,我如何循环第二个问题,这样,如果回答不是肯定的,它会再次问这个问题。我曾尝试在if语句周围放置一个循环,但每当我尝试从用户那里获得另一个响应时,它告诉我无法使用变量response来执行此操作。我觉得这是一个简单的修复,因为我理解循环,但我有一个困难的时候围绕着这个具体的问题我的头,提前谢谢你。

  • 我正在编写一个向Android手机发送通知的反应式api。发送通知的过程需要从手机访问令牌代码以将消息推送给它。为了实现这一点,我在服务器端创建了一个endpoint来接收来自手机的令牌。我的问题是保存令牌,然后在上面描述的过程中使用它。这是TokenController、TokenService、TokenRepository和Token POJO: 为了发送通知,我有一个通知控制器,需要访问数

  • 我需要将这段包含多个for循环和if语句的代码转换为Java 8流: 我需要循环遍历一个数组的名称,并返回一个仅包含不重复的名称的列表。如果一个名字出现不止一次,我需要将它从最终列表中删除。 输入->[“Tom”,“George”,“Tom”,“Mike”,“Brian”] 输出->[“George”,“Mike”,“Brian”] 有谁能帮忙吗?

  • 很好的一天!我面临着编写将代理分配到SelectOutputOut块的函数的挑战。考虑到使用if的各种场景。。。函数中的else语句我理解必须涵盖所有可能性(如此处所建议)。然而,问题是,我不希望代理在获得适当的SelectOutputOut块之前离开该函数。如果任何服务块(Network1、Network2或Network3)中没有足够的资源,则可能会出现这种情况。在这种情况下,需要等待任何服务

  • 我正在学习JavaScript/React。我试图在react网站上为tic-tac-toe示例创建一个简单的for循环,但到目前为止,它一直存在问题。奇怪的是,有几个映射示例,但没有for循环示例。 无论如何,对于以下各项: 当我替换"测试代码"时,这个工作 但这次失败了 第二个选项失败,因为它没有创建“单独的”onClick元素。我怎样才能使失败的例子起作用? 更新#1 更新#2我按照@Mat

  • 我最近学习了Java流,并尝试通过转换我以前的一些代码片段来实践一些流特性。程序中的以下传统for循环是将原始数组中的索引及其反向字符串存储到映射中。 然而,我很难使用纯流实现同样的事情。我认为我的问题是如何同时跟踪索引和反向字符串。从传统的for循环中可以看到,我正在将字符串转换为stringBuilder,然后将其反转,然后转换回字符串。最后我把索引和字符串映射。但是我想不出用纯流来跟踪所有这