如何在不阻塞的情况下从 Flux 获取列表?

Posted

技术标签:

【中文标题】如何在不阻塞的情况下从 Flux 获取列表?【英文标题】:How to get a List from Flux without blocking? 【发布时间】:2019-09-09 23:52:35 【问题描述】:

我有一个返回通量的存储库,并希望将结果设置为另一个需要列表的对象。有没有其他方法可以在不阻塞的情况下将结果作为列表获取?

该块正在工作,但需要很长时间。

public class FluxToListTest 

    @Autowired PostRepository postRepository;

    public void setUserPosts(User user) 
      user.setPostList(postRepository.findAllByOrderId(user.getId()).collectList().block());
  



interface PostRepository 

    Flux<Post> findAllByOrderId(final UUID userId);



@Data
class User 
  UUID id;
  List<Post> postList;



class Post 
    UUID id;
    String content;

【问题讨论】:

【参考方案1】:

简而言之 - 。 您不需要从Flux 中提取List。 如果您已经开始使用 Reactor Streams - 请继续使用它。

试试这个代码:

public void setUserPosts(User user) 
    postRepository.findAllByOrderId(user.getId())
        .collectList()
        .doOnNext(user::setPostList)// (1)
        .subscribe();               // (2) 
  
    如果您将操作设置为阻塞,请使用publishOn/subscribeOn 以避免阻塞所有流。 它开始执行您的流

【讨论】:

请记住,这可能会误导您的方法的调用者。如果有人调用setUserPosts(User user),它将立即返回,因此getUserPosts(User user) 调用可能无法读取它刚刚“写入”的内容。

以上是关于如何在不阻塞的情况下从 Flux 获取列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不提交和从数据列表中搜索的情况下从输入中获取价值

如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?

如何在不提交 HTML 表单的情况下从数据库中获取数据? [复制]

如何让 GraphQL 在不进行轮询的情况下从数据库中获取实时/新数据?

如何在不使用提交的情况下从下拉列表中选择值

如何在不使用 for 循环的情况下从列表中删除元素?