提问者:小点点

如何使用Spring reactive逐个处理每个产品的增量进度更新?


我需要有关Spring Reactive的帮助,其中rest调用发布Json对象列表和Spring Boot服务器应该一个接一个地发送处理事件。让我用一个例子简要解释一下。

假设前端UI中有20个产品,用户选择所有要处理的产品。每个产品处理在服务器端至少需要1分钟。每当每个产品被处理时,服务器应该将json消息结构作为事件发送到前端UI以便用户能够看到服务器中每个产品处理的增量进度。

UI,应该是这样的。

产品1处理成功

产品2处理成功

产品3失败

像这样……

在服务器端,java代码应该是这样的。请建议如何使用Spring Reactive实现。

public Flux<ProdModel> createAllCGs(List<Product> prodList) {

        for(Product p : prodList) {

            //Process here ...
        }

        //use Spring Reactor Flux

        //return Flux type object in the form of Json structure event not as Text Stream event.
    }

我知道有一些变通方法可以使用传统的轮询机制或逐个发送产品来实现它。我的问题更多的是在Spring Reactive方面,其中rest调用通过以json格式向UI方提供相应的响应来逐个发送一堆待处理的产品。我不知道这是否可能。如果你认为使用Spring Reactive是不可能的,那对我来说也很好,这样我就可以和我的架构师交流,他提出了这个建议。


共1个答案

匿名用户

我挣扎了一下才找到答案,我也是Spring Reactive的新手。我希望这个答案能对其他人有所帮助。

我在下面提供了代码片段。

public Flux<ProdModel> createAllCGs(List<Product> prodList) {
      return Flux.fromIterable(prodList)
            .map(
                prodModel -> {
                  System.out.println("Input Data VM ::: " + prodModel);
                  return getProdModel(reviewModel);
                })
            .delayElements(Duration.ofSeconds(3));
    }

    private getProdModel getProdModel(ProdModel prodModel) {
        logger.debug("Time Now: {}", LocalDate.now());
        ProdModel cgModel = new CGModel();
        cgModel.setCgName("some Name");
        cgModel.setMessage("some meaningful message");
        cgModel.setTimestamp(LocalDateTime.now().toString());
        return cgModel;
  }

如果你创建一个简单的GET类型的rest终端,并使用上述方法,你可以在浏览器中看到3秒后一个接一个的输出。