- 3
- 0
- 约6.46千字
- 约 4页
- 2023-09-11 发布于上海
- 举报
Java后端主动向前端推送消息
后端向前端推送消息就需要长连接,⾸先想到的就是websocket。这⾥推荐⼀个⽐websocket更轻量级的长连接推送实现⽅式:
SpringBoot之SseEmitter
contrller:
//@CrossOrigin //跨域(看具体情况)
@RestController
@RequestMapping(@RequestMapping( )
public class TestNotify {
/**
⽤于创建连接(将⽤户注册到 中)
* server
*/
@GetMapping(@GetMapping( )
public SseEmitter connect(@PathVariable String userId) {
return SseEmitterServer.connect(userId);
}
@GetMapping(@GetMapping( )
public ResponseEntityString push(@PathVariable(name = ) String message) {
SseEmitterServer.batchSendMessage(message);
return ResponseEntity.ok(( 送消息给所有⼈送消息给所有⼈);
}
}
server:
/**
主动向前端推送信息
*
* @Date 2021/4/21
*/
public class SseEmitterServer {
private static final Logger logger = LoggerFactory.getLogger(SseEmitterServer.class);
/**
当前连接数
*
*/
private static AtomicInteger count = new AtomicInteger(0);
/**
使⽤ 对象,便于根据 来获取对应的 ,或者放 ⾥⾯
* map userId SseEmitter redis
*/
private static MapString, SseEmitter sseEmitterMap = new ConcurrentHashMap();
/**
创建⽤户连接并返回
* SseEmitter
⽤户
* @param employeeCode ID
* @return SseEmitter
*/
public static SseEmitter connect(String employeeCode) {
设置超时时间,表⽰不过期。默认 秒,超过时间未完成会抛出异常:
// 0 30 AsyncRequestTimeoutException
SseEmitter sseEmitter = new SseEmitter(0L);
// 注册回调
sseEmitter.onCompletion(completionCallBack(employeeCode));
sseEmitter.onError(errorCallBack(employeeCode));
sseEmitter.onTimeout(timeoutCallBack(employeeCode));
sseEmitterMap.put(employeeCode, sseEmitter);
数量
// +1
count.getAndIncrement();
您可能关注的文档
最近下载
- 偷窥漫画第一季完整.docx VIP
- 走向成熟(青春期男生性教育).ppt VIP
- 2025年上海市中考语文试卷真题(含答案解析).pdf
- 内蒙古房屋市政工程建设、监理、施工单位施工现场安全资料用表.pdf VIP
- 附表C 施工单位施工现场安全资料用表.doc VIP
- 2025年中小学教师副高水平能力测试题(附答案).docx
- 深度解析(2026)《GBT 8568-2013铁路行车组织词汇》.pptx VIP
- CRH380B动车组司机台设备及操作上课讲义.ppt VIP
- 2026《W市希望高级中学教学楼工程工程量清单编制及招标控制价计价》10000字.docx
- CRH380A型动车组-司机室讲义.pdf VIP
原创力文档

文档评论(0)