diff --git a/src/main/java/com/jmfy/controller/ServerInfoController.java b/src/main/java/com/jmfy/controller/ServerInfoController.java index d6d4ef9..7060861 100644 --- a/src/main/java/com/jmfy/controller/ServerInfoController.java +++ b/src/main/java/com/jmfy/controller/ServerInfoController.java @@ -267,6 +267,7 @@ public class ServerInfoController { serverInfoDao.updateOpenServerTime(vo.getServer_id(),vo.getOpenTime()); // 重启服务器 GMHandler.sendGm(info.getServer_id(),"reloadserverconfig"); + autoServerManager.restartServer2(info.getServer_id()); }else { updateGmGroupId(vo.getServer_id(),vo.getCrossGroupId()); } @@ -274,6 +275,46 @@ public class ServerInfoController { return 1; } + /** + * 批量修改服务器状态 + * @param request + * @return + * @throws Exception + */ + @RequestMapping(value = "/serverListEdit", method = {RequestMethod.POST, RequestMethod.GET}) + public @ResponseBody int serverListEdit(HttpServletRequest request) throws Exception { + // f服务器列表 + String serverId = request.getParameter("serverId"); + String[] serverIds = serverId.split(","); + + String status = request.getParameter("status"); + String crossIdStr = request.getParameter("crossId"); + String patch = "[-]?[0-9]+?"; + boolean matches = patch.matches(crossIdStr); + + Map allServerMap = serverInfoDao.getAllServerMap(); + for (String id : serverIds) { + ServerInfo info = allServerMap.get(id); + if (info == null){ + LoginController.addQueue("无法在数据库内找到对应的服务器id,操作失败,服务器id:"+id); + continue; + } + // 存在未运行状态的服务器不能批量修改 + if (Integer.parseInt(info.getStatus()) == ServerStatusEnum.NOT_OPERATE.getId()){ + LoginController.addQueue("服务器未处于《未运营》状态,无法修改,服务器id:"+id); + continue; + } + // 修改服务器信息 + serverInfoDao.updateServerInfo(id, status); + // 修改跨服id,空或者非整数不做修改 + if (matches){ + updateGmGroupId(id,Integer.parseInt(crossIdStr)); + } + } + return 1; + } + + /** * 清库 * @return @@ -303,46 +344,6 @@ public class ServerInfoController { return 1; } - /** - * 批量修改服务器状态 - * @param request - * @return - * @throws Exception - */ - @RequestMapping(value = "/serverListEdit", method = {RequestMethod.POST, RequestMethod.GET}) - public @ResponseBody int serverListEdit(HttpServletRequest request) throws Exception { - // f服务器列表 - String serverId = request.getParameter("serverId"); - String[] serverIds = serverId.split(","); - - String status = request.getParameter("status"); - String crossIdStr = request.getParameter("crossId"); - String patch = "[-]?[0-9]+?"; - boolean matches = patch.matches(crossIdStr); - - Map allServerMap = serverInfoDao.getAllServerMap(); - for (String id : serverIds) { - ServerInfo info = allServerMap.get(id); - if (info == null){ - LOGGER.error("存在"); - LoginController.addQueue("无法在数据库内找到对应的服务器id,操作失败,服务器id:"+id); - continue; - } - // 存在未运行状态的服务器不能批量修改 - if (Integer.parseInt(info.getStatus()) == ServerStatusEnum.NOT_OPERATE.getId()){ - LoginController.addQueue("无法在数据库内找到对应的服务器id,操作失败,服务器id:"+id); - continue; - } - // 修改服务器信息 - serverInfoDao.updateServerInfo(id, status); - // 修改跨服id,空或者非整数不做修改 - if (matches){ - updateGmGroupId(id,Integer.parseInt(crossIdStr)); - } - } - return 1; - } - @RequestMapping(value = "/serverNumberInfo", method = {RequestMethod.POST, RequestMethod.GET}) public String serverNumberInfo(ModelMap map) throws Exception { List serverInfos = serverInfoDao.getAllServerInfo(); diff --git a/src/main/java/com/jmfy/model/ServerInfo.java b/src/main/java/com/jmfy/model/ServerInfo.java index 5589ff1..dd5f53b 100644 --- a/src/main/java/com/jmfy/model/ServerInfo.java +++ b/src/main/java/com/jmfy/model/ServerInfo.java @@ -238,9 +238,11 @@ public class ServerInfo implements Comparable,Cloneable { @Override public int compareTo(Object o) { ServerInfo info = (ServerInfo) o; - if (info.get_id() == this.get_id()) { + int id1 = Integer.parseInt(info.getServer_id()); + int id2 = Integer.parseInt(this.getServer_id()); + if (id1 == id2) { return 0; - } else if (this.get_id() > info.get_id()) { + } else if (id2 > id1) { return 1; } else { return -1; diff --git a/src/main/java/com/jmfy/utils/AutoServerManager.java b/src/main/java/com/jmfy/utils/AutoServerManager.java index 2fb58e5..0f5445c 100644 --- a/src/main/java/com/jmfy/utils/AutoServerManager.java +++ b/src/main/java/com/jmfy/utils/AutoServerManager.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -66,6 +67,14 @@ public class AutoServerManager { return autoServerSetting != null && "1".equals(autoServerSetting.getState()); } + private static ServerInfo getServerIndex(List infoList, int num){ + ServerInfo info = null; + try { + info = infoList.get(num); + }catch (Exception ignored){} + return info; + } + /** * 开服 */ @@ -75,69 +84,77 @@ public class AutoServerManager { // 当前时间 long now = DateUtil.now(); // 获取全部服务器列表,排除非未运营和准备中的服务器,正序排列 - List allServerInfo = serverInfoDao.getAllServerInfo(); - allServerInfo.removeIf(v -> Integer.parseInt(v.getStatus()) != ServerStatusEnum.NOT_OPERATE.getId()); - Stream sorted = allServerInfo.stream().sorted(); - Optional first = sorted.findFirst(); - if (!first.isPresent()) { + List infoList = serverInfoDao.getAllServerInfo().stream().sorted().collect(Collectors.toList()); + if (infoList.isEmpty()) { LOGGER.error("自动开服,服务器列表获取为空"); return; } - ServerInfo newServer = first.get(); - // 自动开服配置 - AutoServerSetting setting = RedisUtil.getInstence().getMapValue(RedisUserKey.AUTO_START_SERVER_SETTING, "1", "1", AutoServerSetting.class, -1); - // 注册人数 - if (REGISTER.equals(setting.getChoose())) { - // 注册人数3分钟检查一次 - if (now >= (date + TIME)) { - // 获取服务器id - String serverId = String.valueOf(Integer.parseInt(newServer.getServer_id()) - 1); - // 注册人数 - long registerNum = serverInfoDao.getRegisterNum(serverId); - LOGGER.info("自动开服,注册人数判断,条件值:{},当前服务器人数:{}:{}", setting.getNum(), serverId, registerNum); - if (registerNum >= Integer.parseInt(setting.getNum())) { - startServers(newServer); + for (int i = 0; i < infoList.size(); i++) { + ServerInfo newServer = infoList.get(i); + if (newServer.getStatusInt() != ServerStatusEnum.NOT_OPERATE.getId()){ + continue; + } + // 自动开服配置 + AutoServerSetting setting = RedisUtil.getInstence().getMapValue(RedisUserKey.AUTO_START_SERVER_SETTING, "1", "1", AutoServerSetting.class, -1); + // 注册人数 + if (REGISTER.equals(setting.getChoose())) { + // 注册人数3分钟检查一次 + if (now >= (date + TIME)) { + ServerInfo oldServer = getServerIndex(infoList, i - 1); + if (oldServer == null){ + startServers(null, newServer); + }else { + // 注册人数 + long registerNum = serverInfoDao.getRegisterNum(oldServer.getServer_id()); + LOGGER.info("自动开服,注册人数判断,条件值:{},当前服务器人数:{}:{}", setting.getNum(), oldServer.getServer_id(), registerNum); + if (registerNum >= Integer.parseInt(setting.getNum())) { + startServers(oldServer, newServer); + } + } + // 更新时间 + date = now; } - // 更新时间 - date = now; } - } - // 时间开服,每分钟 - else if (AUTOTIME.equals(setting.getChoose())) { - // 比较时间是否一致,精确到分 - boolean compareTime = DateUtil.compareTime(setting.getTime()); - LOGGER.info("自动开服,时间判断,条件值:{},当前时间:{},结果:{}", setting.getTime(), DateUtil.nowString(), compareTime); - if (compareTime) { - startServers(newServer); + // 时间开服,每分钟 + if (AUTOTIME.equals(setting.getChoose())) { + ServerInfo oldServer = getServerIndex(infoList, i - 1); + // 比较时间是否一致,精确到分 + boolean compareTime = DateUtil.compareTime(setting.getTime()); + LOGGER.info("自动开服,时间判断,条件值:{},当前时间:{},结果:{}", setting.getTime(), DateUtil.nowString(), compareTime); + if (compareTime) { + startServers(oldServer, newServer); + } } + break; } } }catch (Exception e){ - LOGGER.error("自动开服报错:::"); + LOGGER.error("自动开服报错:::{}",e.getMessage()); e.printStackTrace(); } } /** * 自动开服封装 - * @param serverInfo + * @param oldServer + * @param newServer * @throws Exception */ - public void startServers(ServerInfo serverInfo) throws Exception { + private void startServers(ServerInfo oldServer, ServerInfo newServer) throws Exception { // 停服脚本 - AutoServerManager.getInstance().delUser(serverInfo); + AutoServerManager.getInstance().delUser(newServer); // 间隔30秒再获取开服数据 Thread.sleep(DateUtil.ONE_SECOND * 30); // 验证 - boolean serverStatus = verifyServerStatus(serverInfo); + boolean serverStatus = verifyServerStatus(newServer); if (serverStatus){ // 旧服务器状态更新 - String serverId = String.valueOf(Integer.parseInt(serverInfo.getServer_id()) - 1); - ServerInfo oldServer = serverInfoDao.getServerInfo(serverId); - updateServer(oldServer, ServerStatusEnum.CROWDING.getId(), 0, serverId); + if (oldServer != null){ + updateServer(oldServer, ServerStatusEnum.CROWDING.getId(), 0, oldServer.getServer_id()); + } // 新服务器状态更新 - updateServer(serverInfo, ServerStatusEnum.FLUENT.getId(), 1, serverInfo.getServer_id()); - LoginController.addQueue("自动开服,服务器:" + serverInfo.getServer_id() +"清库重启完毕"); + updateServer(newServer, ServerStatusEnum.FLUENT.getId(), 1, newServer.getServer_id()); + LoginController.addQueue("自动开服,服务器:" + newServer.getServer_id() +" 清库重启完毕"); } } @@ -152,8 +169,6 @@ public class AutoServerManager { int i = 0; String content = GMHandler.getCmdContent("serverstatus", serverId); do { - // 间隔30秒再获取开服数据 - Thread.sleep(DateUtil.ONE_SECOND * 30); // 发送rpc到游戏服 Result result1 = RPCClient.sendCmd(Integer.parseInt(serverId),content); if (result1 == null) { @@ -201,6 +216,7 @@ public class AutoServerManager { e.printStackTrace(); } // 发送钉钉 + LOGGER.error(cont); // dingTalkLogic.sendDingTalk(serverInfo,cont,false); return false; } diff --git a/src/main/java/com/jmfy/utils/DateUtil.java b/src/main/java/com/jmfy/utils/DateUtil.java index 3b41982..71a0a81 100644 --- a/src/main/java/com/jmfy/utils/DateUtil.java +++ b/src/main/java/com/jmfy/utils/DateUtil.java @@ -111,7 +111,7 @@ public class DateUtil { } /** - * 日期转换为时间戳 + * 比较时间 * @param timers * @return */ diff --git a/src/main/resources/templates/serverInfoEdit.html b/src/main/resources/templates/serverInfoEdit.html index 1de3da2..f216d9a 100644 --- a/src/main/resources/templates/serverInfoEdit.html +++ b/src/main/resources/templates/serverInfoEdit.html @@ -129,15 +129,16 @@
-
-