diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java index 7fa7bcc..f017a0d 100644 --- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java +++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java @@ -23,6 +23,9 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import static robot.mj.thread.ThreadPoolConfig.scheduleDelay; /** * 红中麻将游戏控制器 - 处理游戏协议 @@ -157,7 +160,10 @@ public class EXGameController extends GameController { GroupRoomBusiness.joinRoom(groupId, roomId, robotSession, null); - Thread.sleep(5000); + //使用非阻塞延迟替代Thread.sleep + scheduleDelay(() -> { + + }, 5, TimeUnit.SECONDS); params.del("groupId"); params.del("roomId"); @@ -353,7 +359,10 @@ public class EXGameController extends GameController { //先不放入映射 等确认加入成功后再放入 //robotRoomMapping.put(robotUser.getConnecId(), robotUser); robotRoomMapping.remove(robotUser.getRobotId()); - Thread.sleep(2000); + //非阻塞延迟替代Thread.sleep + scheduleDelay(() -> { + + }, 2, TimeUnit.SECONDS); params.putString("session", "{user}:" + robotId + "," + robotSession); //发送加入房间请求到game_mj_cs @@ -376,15 +385,21 @@ public class EXGameController extends GameController { //添加超时检查机制 CompletableFuture.runAsync(() -> { try { - Thread.sleep(15000); + //定时任务替代Thread.sleep + scheduleDelay(() -> { + //15秒后还没有建立映射关系 加入可能失败 + if (robotRoomMapping.get(robotUser.getConnecId()) == null) { + System.err.println("机器人{"+robotId+"}加入房间{"+roomId+"}超时,清理临时状态"); + robotConnectionManager.disconnectFromGameServer(connecId); + } + }, 15, TimeUnit.SECONDS); //15秒后还没有建立映射关系 加入可能失败 if (robotRoomMapping.get(robotUser.getConnecId()) == null) { System.err.println("机器人{"+robotId+"}加入房间{"+roomId+"}超时,清理临时状态"); - //清理可能残留的状态 robotConnectionManager.disconnectFromGameServer(connecId); } - } catch (InterruptedException e) { - log.error("加入房间超时异常"); + } catch (Exception e) { + log.error("机器人加入房间超时", e); } }, ThreadPoolConfig.getBusinessThreadPool());//指定自定义线程池 robotUser.setIntoRoomTime(robotConnectionManager.getTime()); diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java index dc8397d..f81d9c2 100644 --- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java +++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java @@ -47,7 +47,6 @@ public class RobotConnectionManager { private final String host= Config.GAME_SERVER_HOST; private final int port= Integer.parseInt(Config.GAME_SERVER_PORT); - public RobotConnectionManager() { exGameController = new EXGameController(); } @@ -128,12 +127,16 @@ public class RobotConnectionManager { HuNanHongZhong instance = huNanHongZhongInstances.get(connecId); if (instance != null) { + //清理所有集合数据以释放内存 instance.getHongZhongCardInhand().clear(); instance.getChuGuoCardInhand().clear(); System.out.println("清空HuNanHongZhong集合数据: " + connecId); } + //移除实例 huNanHongZhongInstances.remove(connecId); + + System.out.println("清理完成,当前活跃连接数: " + activeConnections.size() + ", 实例数: " + huNanHongZhongInstances.size()); } if (robotUser != null) { @@ -356,17 +359,17 @@ public class RobotConnectionManager { Jedis jedis2 = Redis.use("group1_db2").getJedis(); try { //红中麻将 机器人处理事件 - //出牌广播 - if ("812".equalsIgnoreCase(command)) { - huNanHongZhong.drawCard(command, message); + //初始化手牌 + if ("811".equalsIgnoreCase(command)) { + robotUser.setStatus(ROBOTEventType.ROBOT_INTOROOM_WORKING); + huNanHongZhong.cardInHead(command, message, client); //处理完协议后保存到Redis HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId); currentInstance.saveToRedis(connecId); } - //初始化手牌 - else if ("811".equalsIgnoreCase(command)) { - robotUser.setStatus(ROBOTEventType.ROBOT_INTOROOM_WORKING); - huNanHongZhong.cardInHead(command, message, client); + //出牌广播 + else if ("812".equalsIgnoreCase(command)) { + huNanHongZhong.drawCard(command, message); //处理完协议后保存到Redis HuNanHongZhong currentInstance = huNanHongZhongInstances.get(connecId); currentInstance.saveToRedis(connecId); diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/thread/ResourceCleanupUtil.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/thread/ResourceCleanupUtil.java index b91a44d..c10eb50 100644 --- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/thread/ResourceCleanupUtil.java +++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/thread/ResourceCleanupUtil.java @@ -21,6 +21,8 @@ public class ResourceCleanupUtil { */ public static void performCleanup() { if (pendingCleanupResources.isEmpty()) { + //执行常规清理 + performRegularCleanup(); return; } @@ -32,7 +34,9 @@ public class ResourceCleanupUtil { for (String resourceId : resourcesToClean) { try { - + //这里可以根据resourceId的具体类型执行不同的清理逻辑 + //暂时保持原有逻辑 + //从待清理列表中移除 pendingCleanupResources.remove(resourceId); cleanedCount++; @@ -44,6 +48,9 @@ public class ResourceCleanupUtil { } System.out.println("资源清理完成,共清理: " + cleanedCount + " 个资源"); + + //执行常规清理 + performRegularCleanup(); } /**