Spring Boot 2.x实战54 - Spring Web MVC 26 - 异步请求(HTTP Streaming - SSE)

Spring MVC提供了SseEmitter用来提供对W3C的SSE规范的支持。SSE是Server-Sent Events的缩写。HTML5 API 提供了EventSource对象和服务端交互,服务端返回数据时头数据里的内容类型为:text/event-stream

我们的控制器的代码和ResponseBodyEmitter的几乎差不多:

@RestController
@RequestMapping("/async")
@Slf4j
public class AsyncController {

    private static Map<Long, SseEmitter> sseEmitterMap = new HashMap<>();

		//可使用produces属性执行返回的头信息中的内容类型
    @GetMapping(value = "/{id}/sse", produces = {MediaType.TEXT_EVENT_STREAM_VALUE}) 
    public SseEmitter sseEmitter(@PathVariable Long id){
        SseEmitter emitter = new SseEmitter();
        sseEmitterMap.put(id, emitter);
        return emitter;
    }

    @GetMapping("/{id}/invoke-sse")
    public void invokeSseEmitter(@PathVariable Long id) throws Exception {
        SseEmitter emitter = sseEmitterMap.get(id);
        emitter.send(new AnotherPerson(3l,"bar", 50), new MediaType("application","another-person"));
        Thread.sleep(1000);
        emitter.send(new Person(1l, "wyf", 35), MediaType.APPLICATION_JSON);
        Thread.sleep(1000);
        emitter.send(new Person(2l,"foo", 40), MediaType.APPLICATION_XML);
        Thread.sleep(1000);
        emitter.send("Hello World", MediaType.TEXT_PLAIN);
    }

    @GetMapping("/{id}/close-sse")
    public void closeSseEmitter(@PathVariable Long id) throws IOException {
        SseEmitter emitter = sseEmitterMap.get(id);
        emitter.complete();
        responseBodyEmitterMap.remove(id);
    }
}

我们写一个极简单的静态页面来使用HTML5的EventSource对象。


<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>SSE Demotitle>head>
<body>
<div id="msgFromSse">div>
<script>
var source = new EventSource("/async/1/sse") //新建EventSource对象连接服务器的地址为/async/1/sse
source.addEventListener('open', function (ev) { //监听连接成功的事件
    console.log("连接成功")
}, false);

source.addEventListener('message', function (ev) { { //监听数据发送的事件
    document.getElementById("msgFromSse").innerHTML = ev.data;
} });


source.addEventListener('error',function (ev) { //监听错误的事件
    if (ev.readyState == EventSource.CLOSED){
        console.log("连接毅关闭");
    } else {
        console.log(e.readyState);
    }
}, false);
script>
body>
html>

在Chrome访问https://localhost:8443/sse.html,Network里有一个类型为eventsource的连接,且连接的详细信息里有专门监控数据的EventStream标签页。
Spring Boot 2.x实战54 - Spring Web MVC 26 - 异步请求(HTTP Streaming - SSE)_第1张图片
Spring Boot 2.x实战54 - Spring Web MVC 26 - 异步请求(HTTP Streaming - SSE)_第2张图片
我们访问https://localhost:8443/async/1/invoke-sse从另外的线程向https://localhost:8443/sse.html发送数据,这时页面会每隔一秒显示推送的消息,控制台也可以监控到数据的传送。
Spring Boot 2.x实战54 - Spring Web MVC 26 - 异步请求(HTTP Streaming - SSE)_第3张图片

新书推荐:

我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html
在这里插入图片描述

主要包含目录有:

第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和屁股里(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。

你可能感兴趣的:(Spring,Boot2.x实战,-,Spring,MVC,Spring,Boot2.x实战全集)