首页 > 编程语言 >JAVA SSE 服务端单向消息通知

JAVA SSE 服务端单向消息通知

时间:2024-06-21 15:44:53浏览次数:13  
标签:JAVA remove 服务端 SseEmitter SSE sseEmitter id pool

工作记录关于只需要服务端向web端单向通知的技术SSE的技术落地总结

最近有个需求是关于消息的单向通知,原本考虑用websocket,但是技术经理认为太重,建议采用SSE.
查阅相关技术后 结合实际业务需要新建了一个工具类
@Component
@Slf4j
public class SSEUtils {

private final Map<String, SseEmitter> pool = new ConcurrentHashMap<String, SseEmitter>();

/**
* sse发送消息
*
* @param ids
* @param content
*/
public void sendMessageBySSE(List<String> ids, SysMessageBase content) {
log.info("SSE对象暂存池数据={}" ,pool );
for (String id : ids) {
SseEmitter sseEmitter = pool.get(id);
if (ObjectUtil.isNull(sseEmitter)) {
//0L表示一致存在
sseEmitter = new SseEmitter(0L);
// sseEmitter.onCompletion(()->pool.remove(id));
sseEmitter.onTimeout(() -> pool.remove(id));
pool.put(id, sseEmitter);
}
try {
sseEmitter.send(content);
} catch (IOException e) {
e.printStackTrace();
}
}

}


public SseEmitter subscribe(String id) {
SseEmitter sseEmitter = pool.get(id);
if (ObjectUtil.isNull(sseEmitter)) {
//1000秒 3600000L
sseEmitter = new SseEmitter(0L);
// sseEmitter.onCompletion(() -> pool.remove(id));
sseEmitter.onTimeout(() -> pool.remove(id));
pool.put(id, sseEmitter);
}
return sseEmitter;
}

// @Scheduled(cron ="*/2 * * * * ?")
// public void sendDemo() {
// if (ObjectUtil.isNotNull(pool.keySet().size())&&pool.keySet().size()>0){
// SysMessageBase sysMessage = new SysMessageBase();
// sysMessage.setTitle("测试SSE消息定时发送");
// for (String key : pool.keySet()) {
// SseEmitter sseEmitter = pool.get(key);
// if (ObjectUtil.isNull(sseEmitter)) {
// //0L表示一致存在
// sseEmitter = new SseEmitter(0L);
// sseEmitter.onCompletion(()->pool.remove(key));
// sseEmitter.onTimeout(() -> pool.remove(key));
// pool.put(key, sseEmitter);
// }
// try {
// sseEmitter.send(sysMessage);
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }else {
// SseEmitter sseEmitter = new SseEmitter(0L);
// pool.put("80", sseEmitter);
// }
//
//
// }

public void loginOut(String id) {
SseEmitter sseEmitter = pool.get(id);
if (ObjectUtil.isNotNull(sseEmitter)) {
pool.remove(id);
}
}
}


@Resource
SSEUtils sseUtils;


@GetMapping(value = "/getSseById", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter subscribe(@RequestParam("id") String id){
return sseUtils.subscribe(id);
}

在本地使用postman测试后没有问题,但是在部署测试环境和前端联调时发现。接口无法调用,查阅相关资料后发现SSE自身不支持跨域,需要在代理中配置。

网上相关的资料都显示只要在原ser中新建loca例如以下![在这里插入图片描述](/i/ll/?i=direct/1fd61a95ec474f99b15552e3ef836f1d.png)
但是在重新部署nginx后发现依然无法调用。在后面技术经理的支持下,解决了这个问题。
解决方式是需要给SSE新建一个ser
![在这里插入图片描述](/i/ll/?i=direct/0e1e80bafef144b4b65105814fe694a3.png)
尝试后,前后端正常调用。

标签:JAVA,remove,服务端,SseEmitter,SSE,sseEmitter,id,pool
From: https://www.cnblogs.com/pangpangjia/p/18260635

相关文章

  • 一个练习项目,好玩的bbs-java
    java这个我是用springboot做的目录结构   application.ymlspring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/my_bbs?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8&am......
  • Java语言设计
    第一章:Java环境搭建Java是一种计算机编程语言;除了java编程语言,还有很多的编程语言:c、c++、c#、python等不同编程语言类比于不同国家语言;每个编程语言的语法不同;应用场景不同Java是一个用于后端开发的编程语言 一、Java历史1.1995年,sun公司推出的一款面向对象的编程语......
  • Java语言设计
    第二章:变量、数据类型、运算符、表达式一、变量1.概念:计算机中的一块内存空间,存储数据的基本单元2.变量的组成部分:数据类型、变量名、数据3.语法:(1)先声明,再赋值:  数据类型变量名;//声明  变量名=值; //赋值   (2)声明的同时并赋值:  数......
  • Java语言设计3
    第三章:分支结构一、if分支结构1.基本if结构:(1)语法:  if(判断条件/布尔表达式){    //语句  }(2)执行原理:如果判断条件成立,则执行{}中的语句2.基本if结构2(1)语法:  if(判断条件/布尔表达式){    //语句1  }else{    //......
  • Java语言设计4
    第四章:循环结构一、理解:1.循环:通过某个条件,重复并且有规律的执行一段代码2.循环组成部分:循环变量的初始化、循环条件、循环变量的改变、循环体3.循环分类:while循环、do..while循环、for循环二、while循环1.语法://循环变量的初始化while(循环条件){  //循环......
  • redis自学(47)服务端优化
    持久化配置Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:①用来做缓存的redis实例尽量不要开启持久化功能②建议关闭RDB持久化功能,使用AOF持久化(RDB的数据安全性一直是有问题的,两次RDB的时间比较长,又不能频繁的RDB,因为耗时久而且需......
  • 【JavaWeb】Servlet快速入门
    具体的实现步骤如下:创建Web项目web-demo,导入Servlet依赖坐标<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><!--此处为什么需要添加该标签?provid......
  • 牛客网最强Java面试八股文(2024年6月持续更新)
    一、Java基础1.JDK和JRE有什么区别?JDK:JavaDevelopmentKit的简称,java开发工具包,提供了java的开发环境和运行环境。JRE:JavaRuntimeEnvironment的简称,java运行环境,为java的运行提供了所需环境。具体来说JDK其实包含了JRE,同时还包含了编译java源码的编译......
  • Java面试题及答案整理( 2024年 6 月最新版,持续更新)
    秋招金九银十快到了,发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全~这套互联网Java工程师面试题包括了:MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Springboot、SpringCloud、MQ、Kafka面试专......
  • Java语言程序设计1
    第一章:Java环境搭建Java是一种计算机编程语言;除了java编程语言,还有很多的编程语言:c、c++、c#、python等不同编程语言类比于不同国家语言;每个编程语言的语法不同;应用场景不同Java是一个用于后端开发的编程语言一、Java历史1.1995年,sun公司推出的一款面向对象的编程语......