当前位置: 首页 > 知识库问答 >
问题:

Spring WebFlux-将Flux转换为List

许彦
2023-03-14

我正在学习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秒钟后“只加载一次”。我错过了什么?

共有1个答案

汪臻
2023-03-14

为此,您可以在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数据,当我们调用时,我们收到的是