我正在学习Spring WebFlux。
我的实体是这样的:
@Table("users")
public class User {
@Id
private Integer id;
private String name;
private int age;
private double salary;
}
我有一个储存库(R2使用H2数据库)如下:
public interface UserRepository extends ReactiveCrudRepository<User,Integer> {
}
我的控制器是:
@Autowired
private UserRepository userRepository;
private static List<User> userList = new ArrayList<>();
@PostConstruct
public void initializeStockObjects() {
User stock1 = new User(11, "aaaa", 123, 123);
User stock2 = new User(12, "bbb", 123, 123);
User stock3 = new User(13, "ccc", 123, 123);
userList.add(stock1);
userList.add(stock2);
userList.add(stock3);
}
@RequestMapping(value = "/livelistofusers", method = RequestMethod.GET, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<List<User>> getUsers() {
return getUserData(userList);
}
public Flux<List<User>> getUserData(List<User> userList) {
Flux<Long> interval = Flux.interval(Duration.ofSeconds(3));
interval.subscribe((i) -> userList.forEach(user -> addNewUser(user)));
Flux<List<User>> transactionFlux = Flux.fromStream(Stream.generate(() -> userList));
return Flux.zip(interval, transactionFlux).map(Tuple2::getT2);
}
目前为止一切正常。我能够每3秒钟向视图返回整个用户列表。这里没有任何问题。
现在,我想将Flue,即Flux Flux2=userRepository.findAll()发送到视图。这意味着,不是返回getUserData(userList);
如何才能返回getUserData(Flux2(...我应该在这里做什么???...我尝试了几件事,但我最终制作了阻塞列表而不是非阻塞...);
?
问题:我如何才能做到这一点?即我如何才能每3秒将整个Flux发送到我的视图。我在这里感到迷茫和无知。任何相关的帮助链接或解决方案将不胜感激。
编辑:
根据尼普纳的评论,我尝试了一下:
@RequestMapping(value = "/livelistofusersall", method = RequestMethod.GET, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<List<User>> getUsersall() {
Flux<Long> interval = Flux.interval(Duration.ofSeconds(3));
interval.subscribe((i) -> userRepository.findAll());
Flux<List<User>> transactionFlux = userRepository.findAll().collectList().flatMapMany(Flux::just);
return Flux.zip(interval, transactionFlux).map(Tuple2::getT2);
}
但是现在在我的上下文路径中,列表在等待3秒钟后“只加载一次”。我错过了什么?
为此,您可以在Flux中使用< code>collectList()运算符,这将给出一个单一的列表。
userRepository.findAll().collectList().flatMapMany(Flux::just);
更新: 一点我想要实现的内容。我有两个服务--一个通过Http返回me,另一个通过Redis返回。对于这两种情况,我有完全相同的功能-10-15个操作符链,我想要实现的是避免重复代码。 例如:
我有一个Web服务,我想检索树的元素到根节点。我有一个网络流量接口,它在每次调用时返回一个单声道: 让我们假设有一棵树 我想创建以下方法: 这将给我在getNodeChain(5)上一个通量,节点为5,3和1,然后完成。 不幸的是,我不太明白如何按顺序组合Monos,但不阻止它们。使用,我想我需要在每个mono上阻塞,以检查它是否有下一个元素。我发现的其他方法似乎只结合了固定数量的mono,但不是
我在我的项目中使用spring webflux与外部API进行通信。在我的项目中,我无法将Flux转换为List。 在尝试对collectList().block()执行同样的操作时,flux的所有元素都被连接到一个字符串中,并存储在List的第0个索引处。如果我返回Flux而不是List,那么它会发送预期的响应。但我需要操作内容并将其作为子对象添加到其他对象中&因此尝试返回列表。 预期结果:[“
我有一个返回列表的现有服务 我如何将下面的示例转换为通量,这样我的结果就可以流式传输,而不必在内存中聚集所有项目? 第一个问题:这里我首先将第一个查询的所有结果提取到内存中,然后在内存中迭代并形成我所有的,然后返回整个列表。 因此我试图返回
如何将flux 转换为mono 对象?
我们使用的是Spring数据,当我们调用时,我们收到的是