使用 Mutiny 运算符的反应式管道
Reactive pipeline using Mutiny operators
我正在开发 反应式 quarkus 后端服务,它执行以下操作。
- 使用 Hibernate Reactive Panache 与 postgres 交互
从后端获取记录列表
- 使用记录的标识符,从另一个远程服务获取数据。
我正在使用 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。
- 将 PancheEntity 返回的 List
对象转换为 Multi,使用列表作为可迭代对象。
- 对于 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());
}
我正在开发 反应式 quarkus 后端服务,它执行以下操作。
- 使用 Hibernate Reactive Panache 与 postgres 交互 从后端获取记录列表
- 使用记录的标识符,从另一个远程服务获取数据。
我正在使用 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。
- 将 PancheEntity 返回的 List
对象转换为 Multi,使用列表作为可迭代对象。 - 对于 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());
}