-
- Spring Boot Streaming and SSE异步处理
-
ResponseBodyEmitter
-
- 服务器端
-
客户端
-
SseEmitter
-
- 服务器端
-
客户端
-
StreamingResponseBody
-
- 服务器端
-
客户端
[](()Spring Boot Streaming and SSE异步处理
-
ResponseBodyEmitter
-
SseEmitter
-
StreamingResponseBody
[](()ResponseBodyEmitter
ResponseBodyEmitter 处理异步响应。
而且,它代表了许多子类的父类-我们将在下面仔细研究其中的一个。
[](()服务器端最好将 ResponseBodyEmitter_与它自己的专用异步线程一起使用,并用_ResponseEntity_包装 (我们可以将其直接注入_发射器):
@Controller
public class ResponseBodyEmitterController {
private ExecutorService executor
= Executors.newCachedThreadPool();
@GetMapping(“/rbe”)
public ResponseEntity handleRbe() {
ResponseBodyEmitter emitter = new ResponseBodyEmitter();
executor(() -> {
try {
emitter.send(
“/rbe” + " @ " + new Date(), MediaType.TEXT_PLAIN);
emitter.complete();
} catch (Exception ex) {
emitter.completeWithError(ex);
}
});
return new ResponseEntity(emitter, HttpStatus.OK);
}
}
[](()客户端对于客户端使用,我们可以使用简单的XHR方法并调用API端点,就像通常的AJAX操作一样:
var xhr = function(url) {
return new Promise(function(resolve, reject) {
var xmhr = new XMLHttpRequest();
//…
xmhr.open(“GET”, url, true);
xmhr.send();
//…
});
};
xhr(‘http://localhost:8080/javamvcasync/rbe’)
.then(function(success){ //… });
[](()SseEmitter
SseEmitter实际上是ResponseBodyEmitter的子类,并提供开箱即用的 其他 服务器发送事件(SSE)支持。
[](()服务器端因此,让我们快速看一下利用此强大实体的示例控制器:
@Controller
public class SseEmitterController {
private ExecutorService nonBlockingService = Executors
.newCachedThreadPool();
@GetMapping(“/sse”)
public SseEmitter handleSse() {
SseEmitter emitter = new SseEmitter();
nonBlockingService.execute(() -> {
try {
emitter.send(“/sse” + " @ " + new Date());
// we could send more events
emitter.complete();
} catch (Exception ex) {
emitter. 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 completeWithError(ex);
}
});
return emitter;



