自动开服修改

master
duhui 2022-06-20 14:34:42 +08:00
parent bba5494d83
commit 87ce1a2bd2
5 changed files with 107 additions and 87 deletions

View File

@ -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<String, ServerInfo> 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<String, ServerInfo> 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<ServerInfo> serverInfos = serverInfoDao.getAllServerInfo();

View File

@ -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;

View File

@ -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<ServerInfo> 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<ServerInfo> allServerInfo = serverInfoDao.getAllServerInfo();
allServerInfo.removeIf(v -> Integer.parseInt(v.getStatus()) != ServerStatusEnum.NOT_OPERATE.getId());
Stream<ServerInfo> sorted = allServerInfo.stream().sorted();
Optional<ServerInfo> first = sorted.findFirst();
if (!first.isPresent()) {
List<ServerInfo> 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;
}

View File

@ -111,7 +111,7 @@ public class DateUtil {
}
/**
*
*
* @param timers
* @return
*/

View File

@ -129,15 +129,16 @@
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">
<label class="form-label col-xs-4 col-sm-2" title="未运营状态下修改立刻生效,其他状态周一零点生效">
<span class="c-red">*</span>
跨服分组id</label>
跨服分组id
</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="number" name="groupId" placeholder="<=0表示不进行分组" th:value="*{getCrossGroupId()}" class="input-text"/>
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">
<label class="form-label col-xs-4 col-sm-2" title="未运营状态下修改立刻生效,其他状态修改不生效">
<span class="c-red">*</span>
开服时间:</label>
<div class="formControls col-xs-8 col-sm-9">