接上一篇文章
若依(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());
// 同上
}
}