| ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPush.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ard-work/src/main/java/com/ruoyi/media/service/impl/webrtcService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPush.java
@@ -23,7 +23,7 @@ import java.util.stream.Collectors; /** * @Description: app位置推送 * @Description: app位置推送(弃用) * @ClassName: AppPositionPush * @Author: 刘苏义 * @Date: 2023年07月25日16:07:04 ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java
对比新文件 @@ -0,0 +1,97 @@ package com.ruoyi.app.position.service.impl; import com.ruoyi.app.position.domain.ArdAppPosition; import com.ruoyi.app.position.service.IArdAppPositionService; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.utils.websocket.util.WebSocketUtils; import lombok.extern.slf4j.Slf4j; import java.util.*; import java.util.stream.Collectors; /** * @ClassName AppPositionPushService * @Description: app位置推送 * @Author 刘苏义 * @Date 2023/7/28 19:18 * @Version 1.0 * {"enabled":false,"frequency":1000,"userId":"69cf75f289424a48ba10cf33fa324206"} */ @Slf4j public class AppPositionPushService { public static Map<String, List<ArdAppPosition>> dataMap = new HashMap<>();//常规数据 每个用户关联 public static Map<String, List<ArdAppPosition>> tempDataMap = new HashMap<>();//临时数据 每个用户关联 public static Map<String, Timer> userTimerMap = new HashMap();//定时器 每个用户关联 public static Map<String, Timer> tempUserTimerMap = new HashMap();//临时定时器 每个用户关联 public static List<ArdAppPosition> initDataList; static { initDataList = getAppPositionList(); } //启动全局定时器 public static Timer startTimerTask(String userId, Integer period) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { List<ArdAppPosition> data = dataMap.get(userId); if (data.size() > 0) { Map newMap = new HashMap<>(); newMap.put("50000", data); WebSocketUtils.sendMessage(WebSocketUtils.ONLINE_USER_SESSIONS.get(userId), newMap); } } }, 0, period); return timer; } //启动引导定时器 public static Timer startTempTimerTask(String userId, Integer period) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { //循环 List<ArdAppPosition> data = tempDataMap.get(userId); if (data.size() > 0) { Map newMap = new HashMap<>(); newMap.put("50000", data); WebSocketUtils.sendMessage(WebSocketUtils.ONLINE_USER_SESSIONS.get(userId), newMap); } } }, 0, period); return timer; } //停止定时器 public static void stopTimerTask(Timer timer) { if (timer != null) { timer.cancel(); log.info("停止运行"); } } //查询所有app用户的位置信息 public static List<ArdAppPosition> getAppPositionList() { List<ArdAppPosition> ArdAppPositions = new ArrayList<>(); ISysUserService sysUserService = SpringUtils.getBean(ISysUserService.class); //获取所有app用户 List<SysUser> list = sysUserService.selectAllAppUserList(new SysUser()); List<SysUser> onlineList = list.stream() .filter(obj -> obj.getAppOnlineState().equals("1")) .collect(Collectors.toList()); for (SysUser sysUser : onlineList) { IArdAppPositionService ardAppPositionService = SpringUtils.getBean(IArdAppPositionService.class); ArdAppPosition ardAppPosition = ardAppPositionService.selectLastArdAppPositionByUserId(sysUser.getUserId()); ArdAppPositions.add(ardAppPosition); } return ArdAppPositions; } } ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
@@ -15,8 +15,10 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; @@ -43,20 +45,42 @@ if (Platform.isWindows()) { String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "mediamtx" + File.separator + "mediamtx.exe"; String ymlPath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "mediamtx" + File.separator + "mediamtx.yml"; try { // 构建启动命令,使用cmd /c start命令来启动可执行程序并显示命令提示符窗口 String[] cmd = {"cmd", "/c", "start", exePath,ymlPath}; ProcessBuilder processBuilder = new ProcessBuilder(cmd); processBuilder.redirectErrorStream(true); // 将错误输出重定向到标准输出 Process process = processBuilder.start(); // 如果你想等待程序完成 int exitCode = process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } // 构建启动命令,使用cmd /c start命令来启动可执行程序并显示命令提示符窗口 // String[] cmd = {"cmd", "/c", "start", exePath,ymlPath}; // ProcessBuilder processBuilder = new ProcessBuilder(cmd); // processBuilder.redirectErrorStream(true); // 将错误输出重定向到标准输出 // Process process = processBuilder.start(); // 如果你想等待程序完成 // int exitCode = process.waitFor(); List<String> cmd = new ArrayList<>(); cmd.add(exePath); cmd.add(ymlPath); commandStart(cmd); } } public static void commandStart(List<String> command) { command.forEach(v -> System.out.print(v + " ")); System.out.println(); System.out.println(); ProcessBuilder builder = new ProcessBuilder(); //正常信息和错误信息合并输出 builder.redirectErrorStream(true); builder.command(command); //开始执行命令 Process process = null; try { process = builder.start(); //如果你想获取到执行完后的信息,那么下面的代码也是需要的 // String line = ""; // BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); // while ((line = br.readLine()) != null) { // System.out.println(line); // } } catch (IOException e) { e.printStackTrace(); } } @Override public String addPath(String name, String rtspPath, String mode) { String rtspUrl = "rtsp://" + mediamtxHost + ":7554/"; ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java
对比新文件 @@ -0,0 +1,58 @@ package com.ruoyi.media.service.impl; import com.sun.jna.Platform; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; /** * @Description: * @ClassName: webrtcService * @Author: 刘苏义 * @Date: 2023年07月26日13:43:07 * @Version: 1.0 **/ @Component public class WebrtcService { @PostConstruct public void init() { if (Platform.isWindows()) { // String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "webrtc" + File.separator + "setup.bat"; // String[] cmd = {"cmd", "/c", "start", exePath}; String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "webrtc" + File.separator + "webrtc-streamer.exe"; List<String> cmd = new ArrayList<>(); cmd.add(exePath); cmd.add("-o"); cmd.add("-H127.0.0.1:8000"); commandStart(cmd); } } public static void commandStart(List<String> command) { command.forEach(v -> System.out.print(v + " ")); System.out.println(); System.out.println(); ProcessBuilder builder = new ProcessBuilder(); //正常信息和错误信息合并输出 builder.redirectErrorStream(true); builder.command(command); //开始执行命令 Process process = null; try { process = builder.start(); // //如果你想获取到执行完后的信息,那么下面的代码也是需要的 // String line = ""; // BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); // while ((line = br.readLine()) != null) { // System.out.println(line); // } } catch (IOException e) { e.printStackTrace(); } } } ard-work/src/main/java/com/ruoyi/media/service/impl/webrtcService.java
文件已删除 ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
@@ -4,6 +4,7 @@ import com.ruoyi.app.position.domain.ArdAppPosition; import com.ruoyi.app.position.service.IArdAppPositionService; import com.ruoyi.app.position.service.impl.AppPositionPush; import com.ruoyi.app.position.service.impl.AppPositionPushService; import com.ruoyi.app.position.service.impl.ArdAppPositionServiceImpl; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.spring.SpringUtils; @@ -18,10 +19,7 @@ import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.*; import java.util.stream.Collectors; /** @@ -36,45 +34,93 @@ @Slf4j(topic = "websocket") @ServerEndpoint("/websocket/{userId}") public class ChatServerEndpoint { @OnOpen public void openSession(@PathParam("userId") String userId, Session session) { WebSocketUtils.ONLINE_USER_SESSIONS.put(userId, session); String message = "用户[" + userId + "] 成功连接!"; log.info("用户登录:" + message); WebSocketUtils.sendMessage(session, message); //每个用户连接时,启动初始所有app用户位置发送 AppPositionPush.initDataMap.put(userId,AppPositionPush.getAppPositionList()); AppPositionPush.initPushTask(userId,session,3000); //region 旧方法 // //每个用户连接时,启动初始所有app用户位置发送 // AppPositionPush.initDataMap.put(userId,AppPositionPush.getAppPositionList()); // AppPositionPush.initPushTask(userId,session,3000); //endregion } @OnMessage public void onMessage(@PathParam("userId") String userId, String message) { log.info("收到消息:" + message); Session session = WebSocketUtils.ONLINE_USER_SESSIONS.get(userId); // WebSocketUtils.sendMessage(session, message); WebSocketUtils.sendMessage(session, message); // sendMessageAll("用户[" + userid + "] : " + message); // 根据用户新的频率重新调整定时任务 Map<String,Object> map = JSONObject.parseObject(message, Map.class); if(map.size()>0) { Integer frequency = (Integer)map.get("frequency"); Map<String, Object> map = JSONObject.parseObject(message, Map.class); if (map.size() > 0) { Boolean enabled = (Boolean) map.get("enabled"); if (enabled) { //启动全局推送 List<ArdAppPosition> newList = new ArrayList<>(AppPositionPushService.initDataList); AppPositionPushService.dataMap.put(userId, newList); if (!AppPositionPushService.userTimerMap.containsKey(userId)) { Timer timer = AppPositionPushService.startTimerTask(userId, 3000); AppPositionPushService.userTimerMap.put(userId, timer);//将定时器关联用户 } } else { //停止全局推送 if (AppPositionPushService.userTimerMap.containsKey(userId)) { Timer timer = AppPositionPushService.userTimerMap.get(userId); AppPositionPushService.stopTimerTask(timer); AppPositionPushService.userTimerMap.remove(userId); } if (AppPositionPushService.tempUserTimerMap.containsKey(userId)) { Timer temptimer = AppPositionPushService.tempUserTimerMap.get(userId); AppPositionPushService.stopTimerTask(temptimer); AppPositionPushService.tempUserTimerMap.remove(userId); } AppPositionPushService.dataMap.remove(userId); AppPositionPushService.tempDataMap.remove(userId); } Integer frequency = (Integer) map.get("frequency"); String uId = (String) map.get("userId"); Map<String, List<ArdAppPosition>> dataMap = new HashMap<>(); List<ArdAppPosition> positionList = AppPositionPush.initDataMap.get(userId);//获取当前用户的默认发送的数据map if(frequency>0) { //接收到频率大于0,属于申请引导,获取除引导外的其他app用户的位置List List<ArdAppPosition> appPositionList = positionList.stream() if (frequency > 0) { List<ArdAppPosition> List = AppPositionPushService.initDataList.stream() .filter(obj -> !obj.getUserId().equals(uId)) .collect(Collectors.toList()); dataMap.put(userId,appPositionList); .collect(Collectors.toList());//去除引导后的list AppPositionPushService.dataMap.put(userId,List); List<ArdAppPosition> tempList = AppPositionPushService.initDataList.stream() .filter(obj -> obj.getUserId().equals(uId)) .collect(Collectors.toList());//获取引导的list AppPositionPushService.tempDataMap.put(userId, tempList); Timer timer = AppPositionPushService.startTempTimerTask(userId, frequency); AppPositionPushService.tempUserTimerMap.put(userId, timer); } else { List<ArdAppPosition> newList = new ArrayList<>(AppPositionPushService.initDataList); AppPositionPushService.dataMap.put(userId, newList); Timer timer = AppPositionPushService.tempUserTimerMap.get(userId); AppPositionPushService.stopTimerTask(timer); AppPositionPushService.tempUserTimerMap.remove(userId); AppPositionPushService.tempDataMap.remove(userId); } else { //接收到频率等于0,属于释放引导,获取到全部app用户的位置List dataMap.put(userId,AppPositionPush.getAppPositionList()); } AppPositionPush.initDataMap.putAll(dataMap);//更新初始会话默认数据map AppPositionPush.startLocationPushTask(userId,session,uId, frequency);//开启新任务 //region 旧方法 // Map<String, List<ArdAppPosition>> dataMap = new HashMap<>(); // List<ArdAppPosition> positionList = AppPositionPush.initDataMap.get(userId);//获取当前用户的默认发送的数据map // if(frequency>0) // { // //接收到频率大于0,属于申请引导,获取除引导外的其他app用户的位置List // List<ArdAppPosition> appPositionList = positionList.stream() // .filter(obj -> !obj.getUserId().equals(uId)) // .collect(Collectors.toList()); // dataMap.put(userId,appPositionList); // } // else { // //接收到频率等于0,属于释放引导,获取到全部app用户的位置List // dataMap.put(userId,AppPositionPush.getAppPositionList()); // } // AppPositionPush.initDataMap.putAll(dataMap);//更新初始会话默认数据map // AppPositionPush.startLocationPushTask(userId,session,uId, frequency);//开启新任务 //endregion } } @@ -83,12 +129,25 @@ //当前的Session 移除 WebSocketUtils.ONLINE_USER_SESSIONS.remove(userId); // //并且通知其他人当前用户已经离开聊天室了 String message="用户[" + userId + "] 断开连接!"; String message = "用户[" + userId + "] 断开连接!"; // sendMessage(session,message); log.info("消息:"+message); log.info("消息:" + message); try { session.close(); AppPositionPush.stopLocationPushTask(session); //停止全局推送 if (AppPositionPushService.userTimerMap.containsKey(userId)) { Timer timer = AppPositionPushService.userTimerMap.get(userId); AppPositionPushService.stopTimerTask(timer); AppPositionPushService.userTimerMap.remove(userId); } if (AppPositionPushService.tempUserTimerMap.containsKey(userId)) { Timer temptimer = AppPositionPushService.tempUserTimerMap.get(userId); AppPositionPushService.stopTimerTask(temptimer); AppPositionPushService.tempUserTimerMap.remove(userId); } AppPositionPushService.dataMap.remove(userId); AppPositionPushService.tempDataMap.remove(userId); // AppPositionPush.stopLocationPushTask(session);//旧方法 } catch (IOException e) { log.error("onClose error", e); } ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java
@@ -4,6 +4,7 @@ import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.rongcloud.service.RongCloudService; import com.ruoyi.system.service.ISysUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -20,6 +21,7 @@ * @Version: 1.0 **/ @Component("RongCloudTask") @Slf4j public class RongCloudTask { @Resource @@ -29,6 +31,7 @@ public void getAppUserOnlineStateTask() { try{ List<SysUser> SysUserList = sysUserService.selectAllAppUserList(new SysUser()); if(SysUserList.size()>0) { for (SysUser sysUser : SysUserList) { @@ -40,6 +43,10 @@ } sysUserService.updateUserProfile(sysUser); } }} catch (Exception ex) { log.error("融云在线接口异常:"+ex.getMessage()); } } }