如何使用 Spring 响应式通过增量进度更新逐个处理每个产品?

Posted

技术标签:

【中文标题】如何使用 Spring 响应式通过增量进度更新逐个处理每个产品?【英文标题】:How to process each product one by one with incremental progress update using Spring reactive? 【发布时间】:2019-11-04 04:38:33 【问题描述】:

我需要有关 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.
    

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

【问题讨论】:

你用过spring webflux吗? 我没用过 Thomas。 那么你需要从基础开始,因为这不是问题,有人可以在 *** 上的一篇文章中帮助你。首先从一些教程开始,以了解它的工作原理。 你能告诉我Spring Reactive是否可能,我希望你已经解决了我的问题。 是的,这是可能的。但如果你想学习响应式编程,我建议你从更简单的东西开始。 【参考方案1】:

我有点努力寻找答案,我也是 Spring Reactive 的新手。我希望这个答案对其他人有所帮助。

我在下面提供代码sn-p。

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类型的休息端点并使用上面的方法,你可以在浏览器中看到3秒后的输出。

【讨论】:

以上是关于如何使用 Spring 响应式通过增量进度更新逐个处理每个产品?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot (十四): 响应式编程以及 Spring Boot Webflux 快速入门

Spring 5 响应式开发

发送一个 AJAX 请求以处理数据并返回多个 PHP 响应以更新其进度

Reactive Spring实战 -- 响应式Kafka交互

响应式布局

(12)Reactor 3 自定义数据流——响应式Spring的道法术器