【问题标题】:How to get a List from Flux without blocking?如何在不阻塞的情况下从 Flux 获取列表?
【发布时间】: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;
}

【问题讨论】:

    标签: java spring-boot reactive-programming spring-webflux


    【解决方案1】:

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

    试试这个代码:

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

    【讨论】:

    • 请记住,这可能会误导您的方法的调用者。如果有人调用setUserPosts(User user),它将立即返回,因此getUserPosts(User user) 调用可能无法读取它刚刚“写入”的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多