0

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

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

我正在使用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<List> 或 Multi 对我​​来说都可以。我只是希望它始终保持非阻塞。

4

1 回答 1

0

我已经通过编写以下管道来实现目标。

  1. 将 PancheEntity 返回的 List<Uni> 对象转换为 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());
}

于 2021-09-13T11:38:34.023 回答