如何在不使用 Controller 的情况下将数据从后端 Springboot 发送到客户端前端?

How to send data from backend Springboot to client frontend without the use of a Controller?

项目概况是这样的:

  1. 通过端点上传文件到 Springboot 服务器
  2. 端点在收到文件时发送 OK 响应,但继续在后台处理文件,运行 测试文件。

因此,由于控制器的端点已经 return 响应,我如何在使用控制器之外将信息从后端发送到前端。

这是控制器 return 响应后 运行 的内容:

     CompletableFuture.runAsync(() -> {
            int count = 0;
            boolean stillProcessing = true;
            while (stillProcessing) {
                stillProcessing = !test.isTestComplete();
                if (test.getNumberOfInstancesComplete() > count) {
                    count = test.getNumberOfInstancesComplete();
                    log.info("{}/{} instances completed so far", count, test.getInstances().size());
                }
            }
        });

log.info 行是我需要 return 前端 React 方面的内容。

最终目标基本上是使用 log.info() 中打印的值向用户显示一个加载栏。

您可以在没有控制器的情况下使用 websockets 通知前端。这是随时使用 STOMP 从后端向客户端发送消息的示例代码。

@Component
public class PushMessage {

  @Autowired
  SimpMessagingTemplate simpMessagingTemplate;


  public <T> void invokeWebSocketEndpoint(String endpoint, T payload) {
    this.simpMessagingTemplate.convertAndSend(endpoint, payload);
  }

}

有关 STOMP websockets 的更多信息,请查看此 link https://spring.io/guides/gs/messaging-stomp-websocket/

如果你不想在客户端和服务器之间进行双向通信,只想从服务器向客户端推送消息,你也可以使用服务器发送的事件。这是一个简单的例子。

  @GetMapping(value = "/test")
  public SseEmitter test() {
    SseEmitter emitter = new SseEmitter();
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    executorService.execute(() -> {
      try {
        Process p = Runtime.getRuntime().exec("ping -c 10 www.google.com");
        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
          String line;
          while ((line = bufferedReader.readLine()) != null) {
            emitter.send(line);
          }
          emitter.complete();
        }
      } catch (IOException e) {
        emitter.completeWithError(e);
        e.printStackTrace();
      }
    });
    executorService.shutdown();
    return emitter;
  }

有关服务器发送事件的更多信息,请参阅此 https://www.baeldung.com/spring-server-sent-events

您可以使用 EventSource 从您的前端使用服务器发送的事件 API https://developer.mozilla.org/en-US/docs/Web/API/EventSource