【发布时间】:2021-11-17 11:43:36
【问题描述】:
我有一些服务方法正在执行 3 秒。我想在处理开始时(HTTPStatus.PROCESSING)和完成(HTTPSTATUS.OK)后(3秒)向客户端发送信息。现在我有了这个。无法意识到如何改善。它不能正常工作
控制器
@RestController
public class MainController {
private ExecutorService nonBlockingService = Executors
.newCachedThreadPool();
@Async
@CrossOrigin
@GetMapping("/sse")
public SseEmitter handleSse() throws IOException, InterruptedException {
SseEmitter emitter = new SseEmitter();
emitter.send(HttpStatus.PROCESSING);
TestService.doSMG();
emitter.send(HttpStatus.OK);
return emitter;
}
}
服务
public class TestService {
public static void doSMG() throws InterruptedException {
TimeUnit.SECONDS.sleep(1);
}
}
客户
<html>
<head>
<script>
var sse = new EventSource('http://localhost:8080/sse');
sse.onmessage = function (evt) {
var el = document.getElementById('sse');
el.appendChild(document.createTextNode(evt.data));
el.appendChild(document.createElement('br'));
};
</script>
</head>
<body>
<p id = "sse">
</p>
</body>
</html>
【问题讨论】:
-
您需要返回
SseEmitter并将其传递给TestService.doMSMG消息,以便完成后它可以发送消息。或者执行TestService.doSMG()方法 async 然后发送消息。目前它直接做所有事情。还要记住,发射器保持打开状态,因此在发送最后一条消息后,您还需要对其调用complete方法,以便它可以进行清理。 -
@M.Deinum 感谢您的回答。可以举个例子吗?
标签: javascript java spring spring-boot asynchronous