若依(RuoYi-Vue-Plus)框架使用WebSocket(2)

接上一篇文章

若依(RuoYi-Vue-Plus)框架使用WebSocket(1)

++本文主要内容为:数据有变动(如:新增、修改、删除等),后台通过websocket主动推送数据到前端页面。++

推送时机:业务处理完成后,重新查询数据,再推送。

Service层涉及到事务提交问题,在事务没提交完成,重新查询不到最新数据。

所以后台主动推送的代码,要么写在controller业务处理完成后,要么使用AOP。

websocket不属于业务范畴,所以最好使用AOP推送。

这儿使用AspectJ,在controller接口执行完成后,再做处理。

1. 启动类添加注解

在微服务启动类加上注解:

java 复制代码
@EnableAspectJAutoProxy // 启用AspectJ,开启AOP

2.AspectJ 类

(1)WebSocketUtils 在 公共组件包 ruoyi-common-websocket 下。

(2)官方文档推荐使用 WebSocketUtils.publishMessage 推送数据

不过在这个方法中,当前在线的会话才会推送,有这么一个判断

if (WebSocketSessionHolder.existSession(sessionKey))

博主不知道怎么将当前登录人加入在线会话中,所以不用 publishMessage,

而采用WebSocketUtils.publishAll,推送给所有人。

java 复制代码
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.his.mapper.HisBespeakMapper;
import org.dromara.his.service.IHisBespeakServiceV2;
import org.dromara.his.service.impl.HisBespeakAsyncServiceImpl;
import org.dromara.system.service.ISysUserService;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

import org.dromara.common.websocket.utils.WebSocketUtils;

/**
 * xxx管理 拦截器
 *
 * @author 
 * @date 2026/1/19 星期一
 * @since JDK 17
 */
@Slf4j
@Component
@Aspect
public class HisBespeakAspect {

    /** xxxMapper */
    @Resource
    private XXXMapper hisBespeakMapper;

	@AfterReturning(value = "execution(* org.dromara.his.controller.XXXController.add(..))", returning = "returnValue")
	public void afterInsert(JoinPoint joinPoint, Object returnValue) {
        log.info("新增xx拦截器-开始.");
		// TODO 查询数据
        List<XX> list = ;
		// 构造包含type字段的消息对象
		Map<String, Object> messageData = new HashMap<>();
		messageData.put("type", "bespeaklist"); // 数据类型
		messageData.put("rows", list);
		messageData.put("code", 200);
		messageData.put("message", "success");

		JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

		// 广播消息给所有连接的客户端
		String message = JSON.toJSONString(messageData, SerializerFeature.WriteDateUseDateFormat);
		WebSocketUtils.publishAll(message);
	}

    @AfterReturning(value = "execution(* org.dromara.his.controller.XXXController.edit(..))", returning = "returnValue")
    public void afterUpdate(JoinPoint joinPoint, Object returnValue) {
        log.info("修改xx拦截器-开始.当前登录人id:{}", LoginHelper.getUserId());
        // 同上
    }

    @AfterReturning(value = "execution(* org.dromara.his.controller.XXXController.remove(..))", returning = "returnValue")
    public void afterDelete(JoinPoint joinPoint, Object returnValue) {
        log.info("删除xx拦截器-开始.当前登录人id:{}", LoginHelper.getUserId());
        // 同上
    }
}
相关推荐
哦虎!1 小时前
【JavaEE】网络初识
java
for_ever_love__1 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
我是人✓2 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡2 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室3 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项3 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog3 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
秋饼3 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发
摇滚侠3 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y4 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python