服务端常用推送技术有:
1、客户端轮询:ajax定时拉取
2、服务端主动推送:WebSocket。全双工的,本质上是一个额外的tcp连接,建立和关闭时握手使用http协议,其他数据传输不使用http协议,更加复杂一些,适用于需要进行复杂双向数据通讯的场景。
3、服务端主动推送:SSE (Server Send Event)。html5新标准,用来从服务端实时推送数据到浏览器端,
直接建立在当前http连接上,本质上是保持一个http长连接,轻量协议简单的服务器数据推送的场景,使用服务器推送事件, SSE技术是基于单工通信模式,只是单纯的客户端向服务端发送请求,服务端不会主动发送给客户端。服务端采取的策略是抓住这个请求不放,等数据更新的时候才返回给客户端,当客户端接收到消息后,再向服务端发送请求,周而复始。
这篇文章介绍Springboot中使用SseEmitter实现消息推送。
1、服务端:
package com.iscas.biz.test.sse;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
* 测试SSE推送消息
* @author zhuquanwen
* @vesion 1.0
* @date 2021/9/11 21:01
* @since jdk1.8
@RestController
@RequestMapping(path = "sse/test")
public class SseControllerTest {
private static Map<String, SseEmitter> sseCache = new ConcurrentHashMap<>();
@GetMapping(path = "subscribe", produces = {MediaType.TEXT_EVENT_STREAM_VALUE})
public SseEmitter push(String id) throws IOException {
SseEmitter sseEmitter = new SseEmitter(30000L);
sseEmitter.send(SseEmitter.event().reconnectTime(1000).data("连接成功"));
sseCache.put(id, sseEmitter);
System.out.println("add " + id);
sseEmitter.onTimeout(() -> {
System.out.println(id + "超时");
sseCache.remove(id);
});
sseEmitter.onCompletion(() -> System.out.println("完成!!!"));
return sseEmitter;
@GetMapping(path = "push")
public String push(String id, String content) throws IOException {
SseEmitter sseEmitter = sseCache.get(id);
if (sseEmitter != null) {
sseEmitter.send(SseEmitter.event().name("msg").data("后端发送消息:" + content));
return "over";
@GetMapping(path = "over")
public String over(String id) {
SseEmitter sseEmitter = sseCache.get(id);
if (sseEmitter != null) {
sseEmitter.complete();
sseCache.remove(id);
return "over";
其中subscribe
是开启并订阅消息,push
是模拟触发后端推送,over
是模拟断开sse连接。
2、客户端:
<!doctype html>
<html lang="en">
<title>Sse测试</title>
<meta charset="utf-8"/>
</head>
<div>sse测试</div>
<div id="result"></div>
</body>
</html>
<script>
var source = new EventSource('http://localhost:7901/demo/sse/test/subscribe?id=qwe');
source.addEventListener("msg", function(e) {
text = document.getElementById('result').innerText;
text += '\n' + e.data;
console.log(e);
document.getElementById('result').innerText = text;
source.onerror = function(e) {
if (e.readyState == EventSource.CLOSE) {
text = document.getElementById('result').innerText;
text += '\n' + "连接关闭";
<!-- 添加一个开启回调 -->
source.onopen = function (event) {
text = document.getElementById('result').innerText;
text += '\n 开启: ';
console.log(event);
document.getElementById('result').innerText = text;
</script>
服务端常用推送技术有:1、客户端轮询:ajax定时拉取2、服务端主动推送:WebSocket。全双工的,本质上是一个额外的tcp连接,建立和关闭时握手使用http协议,其他数据传输不使用http协议,更加复杂一些,适用于需要进行复杂双向数据通讯的场景。3、服务端主动推送:SSE (Server Send Event)。html5新标准,用来从服务端实时推送数据到浏览器端,直接建立在当前http连接上,本质上是保持一个http长连接,轻量协议简单的服务器数据推送的场景,使用服务器推送事件, SSE技.
rabbitmq+websocket(SpringBoot版)实现分布式消息推送
本来想用websocket做一个消息推送 可是分布式环境下不支持session共享因为服务器不同
所以采用 rabbitMQ+webSocket实现分布式消息推送
生产者将消息 发送给 rabbitMQ 的 virtual-host:/(顶极路由) 再由它路由到交换机 最终由交换机通过路由键指定具体的管道
消费者监听指定的管道获取消息
最终将获取的消息 交给 webSocket 被@OnMessage注解标识的方法
每次消费一条消息交给 被@OnMessage注解标识的方法 返回给前台
实现分布式实时推送
private static final Map<Long, SseEmitter> SSE_EMITTER_MAP = new HashMap<>(16);
@GetMapping("/{id}")
public SseEmitter getSseEmitter(@PathVariable Long id) {
//0L设置永不超时
SseEmitter sseEmitt
这是SpringMVC提供的一种技术,可以实现服务端向客户端实时推送数据.用法非常简单,只需要在Controller提供一个接口,创建并返回SseEmitter对象,发送数据可以在另一个接口调用其send方法发送数据.
SpringBoot已经集成了这个 ,所以不用再引其他依赖
废话不多说 直接贴代码
package com.cuit.sseemitterdemo.sseemitterde...
2.利用长链接,后端向前端主动推送下单消息
果断选择第二种。从以往的经验,首先想到websocket,但是websocket属于双向通道,且服务端比较琐碎,就在网上找了下其他类似技术,看到了SseMmitter,查看了向网上相关文章,及用例。正好符合我们的需求,话不多说,上代码
一、新增see对象
public class SeeResult {
【SpringBoot WEB系列】SSE 服务器发送事件详解
SSE 全称Server Sent Event,直译一下就是服务器发送事件,一般的项目开发中,用到的机会不多,可能很多小伙伴不太清楚这个东西,到底是干啥的,有啥用
本文主要知识点如下:
SSE 扫盲,应用场景分析
借助异步请求实现 sse 功能,加深概念理解
使用SseEmitter实现一个简单的推送示例
I. SSE 扫...
3. 编写推送消息的代码
在需要推送消息的地方,注入JPushClient对象,然后调用JPushClient的相关方法即可实现推送消息的功能。以下是一个简单的推送消息的示例:
```java
@RestController
public class PushController {
@Autowired
private JPushClient jPushClient;
@PostMapping("/push")
public String pushMessage(@RequestParam("message") String message) {
PushPayload payload = PushPayload.newBuilder()
.setPlatform(Platform.all())
.setAudience(Audience.all())
.setNotification(Notification.alert(message))
.build();
try {
PushResult result = jPushClient.sendPush(payload);
return result.toString();
} catch (APIConnectionException | APIRequestException e) {
e.printStackTrace();
return e.getMessage();
在上述代码中,我们构建了一个PushPayload对象,设置了推送平台、推送对象和推送消息,然后调用JPushClient的sendPush方法发送推送消息。
以上就是SpringBoot集成极光推送进行推送消息的基本步骤和代码示例。希望能够对您有所帮助。
TGITCIC: