【问题标题】:Spring WebFlux - Convert Flux to List<Object>Spring WebFlux - 将 Flux 转换为 List<Object>
【发布时间】:2021-02-06 02:03:04
【问题描述】:

我正在学习 Spring WebFlux。

我的实体是这样的:

@Table("users")
public class User {
    @Id
    private Integer id;
    private String name;
    private int age;
    private double salary;
}

我有一个存储库(使用 H2 数据库的 R2),如下所示:

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() 发送到视图。这意味着,除了return getUserData(userList);,我该怎么做return getUserData(flux2(...what should I do here ???... I tried couple of things but I end up making the Blocking list instead of Non-Blocking ...));

问题:我怎样才能做到这一点?即如何每 3 秒将整个 Flux 发送到我的视图。我在这里感到迷失,毫无头绪。任何相关的帮助链接或解决方案将不胜感激。

编辑:

根据 Nipuna 的 cmets 我试过这个:

@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 秒后“仅加载一次”。我在这里缺少什么?

【问题讨论】:

  • 我只是想添加评论,您不应该像使用它的方式使用subscribeSubscribeConsumer 使用。您的应用程序是Producer,而Consuming 是调用客户端。在这种情况下,您应该改用 flatMap
  • 在这里您可以阅读有关如何合并生产者(通量)baeldung.com/reactor-combine-streams

标签: spring h2 spring-webflux r2dbc


【解决方案1】:

您可以在 Flux 中使用 collectList() 运算符,这会给出 List 的 Mono。

userRepository.findAll().collectList().flatMapMany(Flux::just);

【讨论】:

  • 谢谢尼普纳。我更新了我在原始帖子中尝试编辑的内容。
  • @AjayKumar 而不是 Flux:: 只需使用 Flux::generate。 userRepository.findAll().collectList().flatMapMany(list -> Flux.generate(sink->sink.next(list)));
  • 太棒了。 !现在明白你的意思了。并且它按预期工作。非常感谢。
猜你喜欢
  • 2022-01-15
  • 2020-10-04
  • 2019-01-11
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多