如何使用 Spring 反应式以增量进度更新一个一个地处理每个产品?

Sam*_*bit 6 java spring spring-boot reactive spring-webflux

我需要有关 Spring Reactive 的帮助,其中休息调用会发布 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.
    }
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*bit 5

我努力寻找答案,我也是 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;
  }
Run Code Online (Sandbox Code Playgroud)

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