如何在不使用 Controller 的情况下将数据从后端 Springboot 发送到客户端前端?
How to send data from backend Springboot to client frontend without the use of a Controller?
项目概况是这样的:
- 通过端点上传文件到 Springboot 服务器
- 端点在收到文件时发送
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
项目概况是这样的:
- 通过端点上传文件到 Springboot 服务器
- 端点在收到文件时发送
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