如何在不阻塞的情况下从 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 表单的情况下从数据库中获取数据? [复制]