SpringBoot整合SSE

目录

1.SseController

java 复制代码
@Slf4j
@RestController
@RequestMapping("sse")
public class SseController {

    @Autowired
    private SseService sseService;
    @RequestMapping("/")
    public String index(){
        return "sse";
    }

    /**
     * 创建SSE连接
     * @return
     */
    @RequestMapping(path = "/connect",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter sse()
    {
        String uuid = UUID.randomUUID().toString();
        log.info("新用户连接:{}",uuid);
        return sseService.connect(uuid);
    }
    /**
     * 广播消息
     * @param message
     */
    @RequestMapping("/sendMessage")
    @ResponseBody
    public void sendMessage(@RequestBody SseMessage message){
        sseService.sendMessage(message);
    }

}

2. SseService

SseService

java 复制代码
public interface SseService {
    /**
     * 创建sse连接
     * @param uuid
     * @return
     */
    SseEmitter connect(String uuid);

    /**
     * 发送消息
     * @param message
     */
    void sendMessage(SseMessage message);
}

SseServiceImpl

java 复制代码
@Slf4j
@Service
public class SseServiceImpl implements SseService {

    /**
     * sseMesageId的SseEmitter对象映射集
     *
     */
    private static Map<String,SseEmitter> sseEmitterMap = new ConcurrentHashMap<>();


        /**
         * 创建sse连接
         *
         * @param uuid
         * @return
         */
        @Override
        public SseEmitter connect(String uuid) {
            SseEmitter sseEmitter = new SseEmitter();
            //连接成功需要返回数据,否则会出现待处理状态
            try{
                sseEmitter.send(SseEmitter.event().comment("connect success"));
            }catch (IOException e){
                e.printStackTrace();
            }
            //连接断开
            sseEmitter.onCompletion(()->{
                sseEmitterMap.remove(uuid);
            });
            //连接超时
            sseEmitter.onTimeout(()->{
                sseEmitterMap.remove(uuid);
            });
            //连接报错
            sseEmitter.onError((throwable)-> {
                sseEmitterMap.remove(uuid);
            });

            sseEmitterMap.put(uuid,sseEmitter);

            return sseEmitter;
        }

        /**
         * 发送消息
         *
         * @param message
         */
        @Override
        public void sendMessage(SseMessage message) {
            message.setTotal(sseEmitterMap.size());
            sseEmitterMap.forEach((uuid,sseEmiter)->{
                try {
                    sseEmiter.send(message, MediaType.APPLICATION_JSON);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
}

3.SendMessageTask

java 复制代码
@Configuration
public class SendMessageTask {
    @Autowired
    private SseService sseService;
    /**
     * 定时执行 秒 分 时 日 月 周
     */
    @Scheduled(cron = "*/1 * * * * *")//间隔1S
    public void sendMessageTask(){
        SseMessage message = new SseMessage();
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        message.setData(LocalDateTime.now().format(format));
        message.setDtuStatus(1);
        message.setPlcId(01);
        message.setInletValve(0);
        message.setSampleValve(1);
        message.setVentingValve(0);
        message.setDtuStatus(1);
        message.setSamplerStatus("01");
        sseService.sendMessage(message);
    }


}

4.将定时任务加入启动类

5.参考资料

springboot集成sse详细教程: https://bilibili.com/video/BV1pC4y1P7cp

相关推荐
__万波__3 分钟前
二十三种设计模式(十三)--模板方法模式
java·设计模式·模板方法模式
动亦定3 分钟前
微服务中如何保证数据一致性?
java·数据库·微服务·架构
王桑.8 分钟前
Spring中IoC的底层原理
java·后端·spring
Liii40314 分钟前
Java集合详细讲解
java·开发语言
Han.miracle34 分钟前
Spring Boot 项目从入门到排障:核心结构、依赖管理与启动全解析
java·jar
麦麦鸡腿堡42 分钟前
Java_通过反射获取类的结构信息
java·开发语言
IT_陈寒42 分钟前
Redis性能翻倍的5个冷门技巧,90%开发者都不知道的深度优化方案
前端·人工智能·后端
还是鼠鼠1 小时前
SQL语句执行很慢,如何分析呢?
java·数据库·mysql·面试
爱装代码的小瓶子1 小时前
【c++知识铺子】封装map和set(详细版)
android·java·c++
2201_757830871 小时前
tlias的部门的增删改查操作
java·开发语言