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

相关推荐
爬山算法4 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7254 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎4 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄4 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
Moment4 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
忆~遂愿4 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds4 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹4 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚4 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言
Cobyte5 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc