使用 Mutiny 运算符的反应式管道

Reactive pipeline using Mutiny operators

我正在开发 反应式 quarkus 后端服务,它执行以下操作。

  1. 使用 Hibernate Reactive Panache 与 postgres 交互
  2. 从后端获取记录列表
  3. 使用记录的标识符,从另一个远程服务获取数据。

我正在使用 Mutiny 来执行反应流水线。 远程服务和数据库集成都以非阻塞方式单独工作。我只需要帮助编写链接这些的管道。 例如:如下所示

    public Uni<List<Post>> findAllBooks() {
        return Book.listAll()             // Entity returns Uni<List<Book>> succesfully.
                    .map(Collection::stream)
                    .flatMap(book -> postApiClient.getPost(book.getId())  // Reactive postApiClient returns Uni<Post> successfully.
                    .collect(toList());

我在处理 Uni 包装列表然后尝试处理该列表中的单个项目时卡住了。 Uni 或 Multi 都适合我。我只是希望它始终是非阻塞的。

我已经通过编写以下管道实现了 objective。

  1. 将 PancheEntity 返回的 List 对象转换为 Multi,使用列表作为可迭代对象。
  2. 对于 Multi 上的每个项目,调用非阻塞远程服务。

我不担心顺序,因此使用了 transformToUniAndMerge。对于那些需要保持原始列表中数据顺序的人,请使用 transformToUniAndConcatenate

public Multi<String> hello() {
    return Uni.createFrom().item(List.of("hello", "Django", "Hola"))  // Creating a list of Uni as would be returned by PanacheEntity
        .onItem().transformToMulti(x -> Multi.createFrom().iterable(x))  // Transform into Multi by passing the iterable
        .onItem().transformToUniAndMerge(this::mockRemoteService);  // Invoke the non-blocking remote service which returns Uni
}

private Uni<String> mockRemoteService(String item) {
    return Uni.createFrom().item((item + " mutiny").toUpperCase());
}