在 Mutiny 中按顺序进行循环迭代

Make iterations of a loop sequentially in Mutiny

我是响应式编程领域的新手。我目前正在使用 Mutiny 库开发 Java 反应式应用程序。

我需要开发一个循环来等待上一次迭代完成以便开始下一次迭代。例如:

List<Uni<T>> uniList = new ArrayList<>();
for (T item : items) { //items is an already fulfilled collection
    uniList.add(this.doSomethingAndReturnInUni(item));
}


return Uni.combine().all().unis(uniList).combinedWith(unisToCombine -> {
    List<T> list = new ArrayList<>();
    unisToCombine.forEach(x ->list.add(x));
    return list;
  });

示例中的for循环,每次迭代生成一个线程。我想知道如何命令第i次调用方法doSomethingAndReturnInUni()等待第(i-1)次调用触发事件,即顺序进行for循环。可以用这样的方式来描述那些事件吗?

我不知道你为什么要使用 uni,因为它应该只处理一个操作,for 循环你应该使用 multi,你可以在其中处理背压,并且只获取下一个事件,当一个事件是完成的。 Multi可以是运行顺序和并行。

https://quarkus.io/blog/mutiny-back-pressure/

我也做了同样的事情,使用 Multi,请参阅此处的“generateData()”方法:

https://github.com/Serkan80/quarkus-quickstarts/blob/development/redis-streams-quickstart/weather-producer/src/main/java/org/acme/redis/streams/producer/ValuesGenerator.java

你能试试这样的吗?

Builder<Item> items = Uni.join().builder();
for (Item item : items) {
    builder.add(this.doSomethingAndReturnInUni(item));
}
return builder.joinAll().andCollectFailures()
    .flatMap(itemList -> do whatever you need ...)  //itemList type is List<Item>