【问题标题】:REST API to send processing statusREST API 发送处理状态
【发布时间】:2021-05-12 19:53:30
【问题描述】:

致力于使用 Spring Boot 实现 REST API。 Consumer 是一个基于 Angular 的应用程序。

REST API 将两个 CSV 文件作为输入。它分几个阶段进行处理。我想将分阶段完成状态更新为中间响应。有可能实现这一目标吗?请指教。

@PostMapping("/process/")
public ResponseEntity process(@RequestParam("csv1") MultipartFile csv1,
                          @RequestParam("csv2") MultipartFile csv2) {

    Generator generator = new Generator();

    try {
        generator.parseCSV1File(csv1.getInputStream());
        //TO SEND PARSING OF CSV 1 is COMPLETE

        generator.parseCSV2File(csv2.getInputStream());
        //TO SEND PARSING OF CSV 2 is COMPLETE

        List<String> viewScripts = generator.generateViewScript();
        //TO SEND VIEW SCRIPT is GENERATED
    
        return ResponseEntity.ok().body(viewScripts);

    } catch (Exception ex) {
        logger.severe("Error in processing: " + ex);
        return ResponseEntity.ok(HttpStatus.EXPECTATION_FAILED);
    }
}

【问题讨论】:

标签: java spring-boot rest


【解决方案1】:

使用仅基于 HTTP 的解决方案,发送“中间”响应是不可能的。 HTTP 是基于请求-响应的协议,对于单个请求,您将获得单个响应。由于您正在触发一个长时间运行的进程,因此您必须等到该进程完成才能获得响应。

但有解决办法!一个简单的就是使用polling

  1. 在 /process/ 请求上; 1.1 创建进程的id 1.2 在单独的线程中启动进程,在进程完成之前不要阻塞调用者 1.3 将标识符返回给客户端应用
  2. 在后台进程中更新其状态,将其保存在数据库或简单的平面文件中(任何适合您的 ;-))
  3. 创建另一个端点,前端应用程序将使用该端点定期检查(轮询)进程的当前状态。路径可以是 /process/{process-id}/status
  4. 在前端应用程序中使用新创建的端点定期检查状态

当然还有其他解决方案,但轮询可能是最简单且易于实现的,并且会让您进入 HTTP 的“RESTish”世界;-)

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    相关资源
    最近更新 更多