package kr.gmtc.eyesvmsg.controller; import java.io.File; import java.io.UnsupportedEncodingException; import java.time.Duration; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Queue; import javax.annotation.Resource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import gmt.common.type.LogLevelType; import gmt.common.util.GmtUtils; import gmt.common.vo.MonitorInfoVO; import gmt.common.vo.MsgObjVO; import gmt.common.vo.SystemInfoVO; import gmt.controller.GmtController; import gmt.io.client.event.GmtClientEventListener; import gmt.io.client.vo.ClientInfoVO; import gmt.io.server.event.GmtServerEventListener; import gmt.io.server.vo.ServerInfoVO; import gmt.io.server.vo.ServiceClientVO; import gmt.logger.GmtLogManager; import gmt.logger.event.IGmtLogSendHandler; import kr.gmtc.eyesvmsg.send.call.CallController; import kr.gmtc.eyesvmsg.send.call.CallService; import kr.gmtc.eyesvmsg.send.chat.ChatController; import kr.gmtc.eyesvmsg.send.dsast.DsastController; import kr.gmtc.eyesvmsg.send.img.ImgController; import kr.gmtc.eyesvmsg.send.img.ImgService; import kr.gmtc.eyesvmsg.send.passivlc.CheckLastLcController; import kr.gmtc.eyesvmsg.send.passivlc.PassivlcController; import kr.gmtc.eyesvmsg.send.passivlc.PassivlcService; import kr.gmtc.eyesvmsg.send.sms.SmsController; import kr.gmtc.eyesvmsg.send.specialnews.SpecialNewsController; import kr.gmtc.eyesvmsg.send.typhoon.TyphnController; import kr.gmtc.eyesvmsg.send.typhoon.TyphnService; import kr.gmtc.eyesvmsg.send.weather.WeatherController; import kr.gmtc.eyesvmsg.send.weather.WeatherService; import kr.gmtc.eyesvmsg.service.DbService; @RestController @Component("controller") public class MainController extends GmtController { @Resource(name = "packetMap") public HashMap> packetMap; @Resource(name = "packetQ") Queue packetQ; private SystemInfoVO systemInfo; private IGmtLogSendHandler logHandler; private GmtLogManager logger; private String startTime; public int TID = 1; public String CLIENT_IP; public int CLIENT_ID; public int CLIENT_PORT; public boolean flag = true; @Resource(name = "dbController") DbController dbController; @Resource(name = "smsController") SmsController smsController; @Resource(name = "imgController") ImgController imgController; @Resource(name = "imgService") ImgService imgService; @Resource(name = "callController") CallController callController; @Resource(name = "callService") CallService callService; @Resource(name = "passivlcController") PassivlcController passivlcController; @Resource(name = "passivlcService") PassivlcService passivlcService; @Resource(name = "weatherController") WeatherController weatherController; @Resource(name = "weatherService") WeatherService weatherService; @Resource(name = "typhnController") TyphnController typhnController; @Resource(name = "typhnService") TyphnService typhnService; @Resource(name = "dsastController") DsastController dsastController; @Resource(name = "specialNewsController") SpecialNewsController specialNewsController; @Resource(name = "dbService") DbService dbService; @Resource(name = "chatController") ChatController chatController; @Resource(name = "checkLastLcController") CheckLastLcController checkLastLcController; private boolean checkLastLcRunning; private Thread checkLastLcThread; //스레드 선언 private boolean sendRunning; private Thread sendThread; private boolean hbRunning; private Thread hbThread; // 메시지 송신 간격 @Value("${msg.interval}") private int sendIntvl = 5000; // 메시지 별 송신 텀 @Value("${msg.term}") private int msgTerm = 3000; // 메시지 별 송신 텀 @Value("${msg.sndCnt}") private int msgSndCnt = 2; // 위치미수신 자동 송신 횟수(1회에 30분) @Value("${msg.PassivLc.sndCnt}") private int passivLcSndCnt = 2; // 사이트별 송신 텀(단문자) @Value("${site.sms}") private int smsIntvl = 10000; // 사이트별 송신 텀(이미지) @Value("${site.img}") private int imgIntvl = 10000; // 이미지 송신 블럭사이즈 별 텀 @Value("${site.imgSub}") private int imgSubIntvl = 2500; // 사이트별 송신 텀(기상예보) @Value("${site.wether}") private int wetherIntvl = 10000; // 사이트별 송신 텀(태풍정보) @Value("${site.typhn}") private int typhnIntvl = 10000; // 사이트별 송신 텀(수동위치요청) @Value("${site.passivlc}") private int passivlcIntvl = 10000; // 사이트별 송신 텀(조난응답) @Value("${site.dsast}") private int dsastIntvl = 10000; // 사이트별 송신 텀(개별호출,영역호출) @Value("${site.call}") private int callIntvl = 10000; // 사이트별 송신 텀(기상특보) @Value("${site.special}") private int specialIntvl = 10000; // 사이트별 송신 텀(채팅) @Value("${site.chat}") private int chatIntvl = 10000; // Server LifePacket 송신 간격 @Value("${setting.hb}") private int hbIntvl = 10; @Value("${msg.order}") private String msgArrayStr; @Value("${patch.mode}") private boolean patchMode = false; // GW서버 접속 정보 @Value("${connect.ip}") private String conIp = "138.252.11.111"; @Value("${connect.port}") private Integer conPort = 8040; public MainController(@Value("${root}") String path) { super(path); GmtLogManager.setpath(path); startTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); systemInfo = new SystemInfoVO(); logger = GmtLogManager.getInstance(); logger.writeLevelLog("[GmtLogManager] PATH : " + path, LogLevelType.LOG_INFO, "AllLog"); logHandler = new IGmtLogSendHandler() { @Override public void sendlLog(String msg, String name, LogLevelType loglevel) { sendLog(msg, name, loglevel); } }; logger.setLogSendHandler(logHandler); initSystemFromXml(path); // SendController sendController = new SendController(); sendThread = new Thread(new Runnable() { @Override public void run() { LocalDateTime startTime = LocalDateTime.now(); while (sendRunning) { // ALE : 시간 00분00초~01분00초 메세지 전송 안함 // ALE : 시간 30분00초~31분00초 메세지 전송 안함 LocalTime lt = LocalTime.now(); LocalTime min_0 = LocalTime.of(0, 0, 0); LocalTime min_30 = LocalTime.of(0, 30, 0); // 현재 시간값을 hour를 0으로 세팅해준후 비교 LocalTime tmpLt = LocalTime.of(0, lt.getMinute(), lt.getSecond()); if (tmpLt.isAfter(min_0.plusMinutes(1))&&tmpLt.isBefore(min_30)||tmpLt.isAfter(min_30.plusMinutes(1))) { Duration duration = Duration.between(startTime, LocalDateTime.now()); if (duration.getSeconds() >= 1) { startTime = LocalDateTime.now(); try { // process 0:미처리, 3:일부실패재전송 int[] intArray = {0, 3}; // 1.조난응답(14), 2.개별/영역호출(16), 3.단문자(3), 4.수동위치요청(11), 4.기상특보(18), 5.기상예보(5), 7.태풍(6), 8.이미지(4), 6.채팅(30) String[] msgOrder = msgArrayStr.replaceAll(" ", "").split(","); int[] msgArray = Arrays.stream(msgOrder).mapToInt(Integer::parseInt).toArray(); for(int process : intArray) { for(int msgArr : msgArray) { send(msgArr, process); } } } catch (Exception e) { logger.writeLevelLog("[sendThread] " + GmtUtils.getStatckTrace(e), LogLevelType.LOG_ERROR, "AllLog"); } finally { try { Thread.sleep(sendIntvl); } catch (InterruptedException e) { logger.writeLevelLog("[sendThread] : " + GmtUtils.getStatckTrace(e), LogLevelType.LOG_ERROR, "AllLog"); } } } } } } }); checkLastLcThread = new Thread(new Runnable() { @Override public void run() { while (checkLastLcRunning) { try { // 미수신 30분/60분 int min = 30; // 수동위치 자동 송신 횟수 설정Cnt for(int i = 0; i < passivLcSndCnt; i++) { logger.writeLevelLog("[checkLastLcThread] passivLcSndCnt for cnt : " + i , LogLevelType.LOG_INFO, "PASSIVLC_AUTO"); checkLastLcController.CheckLastLc(min); min = min + 30; Thread.sleep(10000); } // STD 송신 List stdList = new ArrayList<>(); stdList = checkLastLcController.SendSTD(); if(!stdList.isEmpty()) { for(int i = 0; i < stdList.size(); i++) { MsgObjVO msg = new MsgObjVO(); msg.setMsg(stdList.get(i).getBytes("EUC-KR")); sendClient(clientInfoList.get(0).getIp(), clientInfoList.get(0).getPort(), msg); logger.writeLevelLog("[checkLastLcThread] STD : " + stdList.get(i) , LogLevelType.LOG_INFO, "STDPacket"); } } } catch (Exception e) { logger.writeLevelLog("[checkLastLcThread] " + GmtUtils.getStatckTrace(e), LogLevelType.LOG_ERROR, "AllLog"); } finally { try { Thread.sleep(40000); } catch (InterruptedException e) { logger.writeLevelLog("[checkLastLcThread] : " + GmtUtils.getStatckTrace(e), LogLevelType.LOG_ERROR, "AllLog"); } } } } }); hbThread = new Thread(new Runnable() { @Override public void run() { LocalDateTime startTime = LocalDateTime.now(); while (hbRunning) { Duration duration = Duration.between(startTime, LocalDateTime.now()); if (duration.getSeconds() >= hbIntvl) { startTime = LocalDateTime.now(); try { if (ConnectCheck()) { String hb = "$HB"; MsgObjVO msg = new MsgObjVO(); msg.setMsg(hb.getBytes("EUC-KR")); for(ClientInfoVO ciVO : clientInfoList) { sendClient(ciVO.getIp(), ciVO.getPort(), msg); } } } catch (Exception e) { logger.writeLevelLog("[hbThread] " + GmtUtils.getStatckTrace(e), LogLevelType.LOG_ERROR, "AllLog"); } finally { try { Thread.sleep(1000); } catch (InterruptedException e) { logger.writeLevelLog("[hbThread] : " + GmtUtils.getStatckTrace(e), LogLevelType.LOG_ERROR, "AllLog"); } } } } } }); } public void send(int msgId, int process) { try { loop: for(int repeat = 0; repeat < msgSndCnt; repeat++) { int cnt = 0; Queue sendQue = new LinkedList(); String sender = ""; int sleepThread = 20000; switch (msgId) { case 3: // 단문자 if(!dbController.repeatSnd(msgId)&&repeat == 0) break loop; sendQue = smsController.getSendSms(process, repeat); sender = "Sms"; sleepThread = smsIntvl; break; case 4: // 이미지 if(!dbController.repeatSnd(msgId)&&repeat == 0) break loop; sendQue = imgController.getSendImg(process, repeat); sender = "Image"; if(sendQue != null && sendQue.size() != 0) { String[] data = sendQue.peek().split("\\|"); String[] headData = data[0].split(","); String totalBlCnt = headData[6]; int totBlCnt = Integer.parseInt(totalBlCnt); int subIntvl = (int)(Math.ceil((double)totBlCnt/(double)5)) * imgSubIntvl ; int intvl = subIntvl + imgIntvl; sleepThread = intvl; } break; case 5: // 기상예보 if(!dbController.repeatSnd(msgId)&&repeat == 0) break loop; if(patchMode){ sendQue = weatherController.getSendWeatherPatch(process, repeat); }else{ sendQue = weatherController.getSendWeather(process, repeat); } sender = "Weather"; sleepThread = wetherIntvl; break; case 6: // 태풍정보 if(!dbController.repeatSnd(msgId)&&repeat == 0) break loop; sendQue = typhnController.getSendTyphn(process, repeat); sender = "Typhoon"; sleepThread = typhnIntvl; break; case 11: // 수동위치요청 if(!dbController.repeatSnd(msgId)&&repeat == 0) break loop; sendQue = passivlcController.getPassivlcRequst(process, repeat); sender = "Passivlc Request"; sleepThread = passivlcIntvl; break; case 14: // 조난응답 sendQue = dsastController.getRspnsDsast(process, repeat); sender = "Dsast Response"; sleepThread = dsastIntvl; break; case 16: // 개별호출, 영역호출 if(!dbController.repeatSnd(msgId)&&repeat == 0) break loop; sendQue = callController.getCallRequst(process, repeat); sender = "Call Request"; sleepThread = callIntvl; break; case 18: // 기상특보 if(!dbController.repeatSnd(msgId)&&repeat == 0) break loop; sendQue = specialNewsController.getSpecialNews(process, repeat); sender = "SpecialNews"; sleepThread = specialIntvl; break; case 30: // 채팅 if(!dbController.repeatSnd(msgId)&&repeat == 0) break loop; sendQue = chatController.getSendChat(process, repeat); sender = "Chat"; sleepThread = chatIntvl; break; } if (ConnectCheck()) { int queueSize = sendQue.size(); boolean swich = true; boolean swich2 = true; if (queueSize != 0) { for (int z = 0; z < queueSize; z++) { if(sendQue.peek().substring(10,15).substring(2, 3).equals("0")) { // 인천 }else if(sendQue.peek().substring(10,15).substring(2, 3).equals("1")) { // 포항 if(swich) { Thread.sleep(sleepThread); swich = false; } }else if(sendQue.peek().substring(10,15).substring(2, 3).equals("2")) { // 고흥 if(swich2) { Thread.sleep(sleepThread); swich2 = false; } } MsgObjVO msg = new MsgObjVO(); GmtLogManager.getInstance().writeLevelLog(sendQue.peek(), LogLevelType.LOG_INFO, "SendPacket"); msg.setMsg(sendQue.poll().getBytes("EUC-KR")); // 패킷 전송 sendClient(clientInfoList.get(0).getIp(), clientInfoList.get(0).getPort(), msg); cnt++; // 메시지간 10milliSec 텀 Thread.sleep(10); } GmtLogManager.getInstance().writeLevelLog( "[MainController.send] - Send " + sender + " [ SUCCESS CNT : " + cnt + " ] ", LogLevelType.LOG_INFO, "SendPacket"); // 메세지 송신 횟수 == 현재 반복횟수가 동일 할 시 sleep 수정 if((msgSndCnt-1) == repeat) { Thread.sleep(msgTerm); }else { Thread.sleep(sleepThread); } } } else { int queueSize = sendQue.size(); if (queueSize != 0) { GmtLogManager.getInstance().writeLevelLog("[MainController.send " + sender + "(No clients connected)]", LogLevelType.LOG_INFO, "FailPacket"); for (int z = 0; z < queueSize; z++) { GmtLogManager.getInstance().writeLevelLog(sendQue.poll(), LogLevelType.LOG_ERROR, "FailPacket"); cnt++; } GmtLogManager.getInstance().writeLevelLog( "[MainController.send(No clients connected)] - Send " + sender + " Log [ FAIL CNT : " + cnt + " ] ", LogLevelType.LOG_ERROR, "FailPacket"); } } } } catch (Exception e) { GmtLogManager.getInstance().writeLevelLog("[MainController.send] " + e.getMessage(), LogLevelType.LOG_ERROR, "FailPacket"); e.printStackTrace(); } } // 실패 패킷 재전송 public void packetReSend(String packet) { try { if (ConnectCheck()) { if (!packet.equals("")) { MsgObjVO msg = new MsgObjVO(); msg.setMsg(packet.getBytes("EUC-KR")); sendClient(clientInfoList.get(0).getIp(), clientInfoList.get(0).getPort(), msg); } } else { if (!packet.equals("")) { GmtLogManager.getInstance().writeLevelLog("[MainController.packetReSend(No clients connected)]" + packet, LogLevelType.LOG_INFO, "FailPacket"); } } } catch (Exception e) { GmtLogManager.getInstance().writeLevelLog("[MainController.packetReSend] " + e.getMessage(), LogLevelType.LOG_ERROR, "FailPacket"); e.printStackTrace(); } } public boolean ConnectCheck() { // 통합게이트웨이 8040포트에 붙었을경우에만 패킷 송신 String sendGwIp = conIp; int sendGwPort = conPort; boolean connectFlag = false; for (int i = 0; i < clientInfoList.size(); i++) { ClientInfoVO civo = clientInfoList.get(i); MonitorInfoVO cimvo = civo.getMonitorInfo(); if (civo.getIp().equals(sendGwIp) && civo.getPort() == sendGwPort) { connectFlag = cimvo.isConnected(); } } return connectFlag; } @Override protected void serialDataIn(MsgObjVO vo) { } @Override protected void serverDataIn(MsgObjVO vo) { } @Override protected void clientDataIn(MsgObjVO vo) { String msg = ""; try { String checkMsg = new String(vo.getMsg()); String[] msgArray = checkMsg.split(","); if(msgArray[1].equals("30") || msgArray[1].equals("32")) { if (clientManager.getClientLineMode(vo.getRecvID())) { msg = new String(vo.getMsg(), "EUC-KR"); logger.writeLevelLog("[MainController - clientDataIn] Receive Packet : " + msg, LogLevelType.LOG_INFO, "ReceivePacket"); } else { msg = GmtUtils.byteArrayToHexString(vo.getMsg()); logger.writeLevelLog("[MainController - clientDataIn] Receive Packet : " + msg, LogLevelType.LOG_INFO, "ReceivePacket"); } packetQ.add(msg); } } catch (UnsupportedEncodingException e) { logger.writeLevelLog("[MainController - clientDataIn] : " + e.getMessage(), LogLevelType.LOG_ERROR, "AllLog"); } } @Override protected GmtClientEventListener createClientEventListener() { GmtClientEventListener listener = new GmtClientEventListener() { @Override public void readyToSend() { } @Override public void error(String ip, int port, int errorCode, String description) { } @Override public void disconnected(String ip, int port, int statusCode, String description) { String msg = "[Client Disconnect : IP[" + ip + "] / PORT [" + String.valueOf(port) + "] "; logger.writeLevelLog(msg, LogLevelType.LOG_INFO, "AllLog"); } @Override public void dataIn() { } @Override public void connectionStatus(String ip, int port, String connEvent, int statusCode, String description) { } @Override public void connected(String ip, int port, int statusCode, String description) { String msg = "[Client Connect : IP[" + ip + "] / PORT [" + String.valueOf(port) + "] "; logger.writeLevelLog(msg, LogLevelType.LOG_INFO, "AllLog"); } @Override public void SSLStatus() { } @Override public void SSLServerAuthentication() { } }; return listener; } @Override protected GmtServerEventListener createServerEventListener() { GmtServerEventListener listener = new GmtServerEventListener() { @Override public void readyToSend(int port) { } @Override public void error(int serverPort, String remoteHost, int remotePort, int errorCode, String description) { } @Override public void dataIn(int serverPort, String remoteHost, int remotePort, String msg) { } @Override public void disconnected(int serverPort, String remoteHost, int remotePort) { String msg = "[SERVER " + String.valueOf(serverPort) + "] SC Disconnected.. IP : " + remoteHost + " PORT : " + String.valueOf(remotePort); logger.writeLevelLog(msg, LogLevelType.LOG_INFO, "AllLog"); } @Override public void connected(int serverPort, String remoteHost, int remotePort) { String msg = "[SERVER " + String.valueOf(serverPort) + "] SC Connected.. IP : " + remoteHost + " PORT : " + String.valueOf(remotePort); logger.writeLevelLog(msg, LogLevelType.LOG_INFO, "AllLog"); } @Override public void SSLClientAuthentication(int serverPort) { } }; return listener; } private void sendLog(String msg, String name, LogLevelType Loglevel) { LocalDateTime dt = LocalDateTime.now(); String currentTime = dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); MsgObjVO vo = new MsgObjVO(); switch (Loglevel.ordinal()) { case 0: msg = "[" + currentTime + "] " + ":" + " TRACE " + ": " + msg; break; case 1: msg = "[" + currentTime + "] " + ":" + " DEBUG " + ": " + msg; break; case 2: msg = "[" + currentTime + "] " + ":" + " INFO " + ": " + msg; break; case 3: msg = "[" + currentTime + "] " + ":" + " WARN " + ": " + msg; break; case 4: msg = "[" + currentTime + "] " + ":" + " ERROR " + ": " + msg; break; case 5: msg = "[" + currentTime + "] " + ":" + " FATAL " + ": " + msg; break; } try { vo.setMsg(msg.getBytes("EUC-KR")); } catch (UnsupportedEncodingException e) { logger.writeLevelLog(GmtUtils.getStatckTrace(e), LogLevelType.LOG_ERROR, "fileLog"); e.printStackTrace(); } broadcastServer(systemInfo.getLogPort(), vo); } private void initSystemFromXml(String dirpath) { try { String rpath = ""; if (dirpath.equals("")) { String root = System.getProperty("user.dir"); rpath = root + "/cfg/system.xml"; } else { rpath = dirpath + "/cfg/system.xml"; } File file = new File(rpath); boolean isExists = file.exists(); if (!isExists) { logger.writeLevelLog("The file does not exist in the directory. [" + rpath + "]", LogLevelType.LOG_ERROR, "AllLog"); return; } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(file); NodeList nodes = doc.getElementsByTagName("System"); for (int i = 0; i < nodes.getLength(); i++) { Node clientNode = nodes.item(i); for (Node child = clientNode.getFirstChild(); child != null; child = child.getNextSibling()) { if (child.getNodeType() != Node.ELEMENT_NODE) { continue; } Element childElement = (Element) child; if (childElement.getNodeName().equals("Info")) { systemInfo.setName(childElement.getAttribute("Name")); systemInfo.setIp(childElement.getAttribute("IP")); systemInfo.setHa(GmtUtils.strToIntDef(childElement.getAttribute("HA"), -1)); } else if (child.getNodeName().equals("Option")) { systemInfo.setBufSize(GmtUtils.strToIntDef(childElement.getAttribute("BufSize"), -1)); } else if (child.getNodeName().equals("Log")) { systemInfo.setLogLevel(GmtUtils.strToIntDef(childElement.getAttribute("Level"), -1)); systemInfo.setLogPort(GmtUtils.strToIntDef(childElement.getAttribute("Port"), -1)); } else if (child.getNodeName().equals("Stat")) { systemInfo.setStatChktime(GmtUtils.strToIntDef(childElement.getAttribute("CheckTime"), -1)); systemInfo.setUpdateTime(GmtUtils.strToIntDef(childElement.getAttribute("UpdateTime"), -1)); systemInfo.setStatSendTime(GmtUtils.strToIntDef(childElement.getAttribute("SndTime"), -1)); systemInfo.setStatSend(Boolean.parseBoolean(childElement.getAttribute("IsSend"))); systemInfo.setStatPort(GmtUtils.strToIntDef(childElement.getAttribute("Port"), -1)); } } } } catch (Exception e) { e.printStackTrace(); } } public void start() { try { super.start(); // Msg Send Start sendRunning = true; sendThread.start(); // Life Packet hbRunning = true; hbThread.start(); // 선박 수동위치 송신 스레드 checkLastLcRunning = true; checkLastLcThread.start(); } catch (Exception e) { logger.writeLevelLog("[MainController.start] " + GmtUtils.getStatckTrace(e), LogLevelType.LOG_ERROR, "AllLog"); System.exit(0); } } public SystemInfoVO getSystemInfo() { return systemInfo; } public void setSystemInfo(SystemInfoVO systemInfo) { this.systemInfo = systemInfo; } public void sendResponse(MsgObjVO vo) { broadcastAllServer(vo); } // 모니터링 상태 소스 @SuppressWarnings("unchecked") @GetMapping(value = "/rest/serverStatus") public JSONArray loadServerStatusInfo() throws Exception { JSONArray data = new JSONArray(); for (int i = 0; i < serverInfoList.size(); i++) { ServerInfoVO sivo = serverInfoList.get(i); MonitorInfoVO mvo = sivo.getMonitorInfo(); JSONObject jo2 = new JSONObject(); jo2.put("ID", sivo.getId()); jo2.put("ServerName", sivo.getName()); jo2.put("ServerPort", sivo.getPort()); jo2.put("SCCount", sivo.getServiceClientCount()); jo2.put("SendBuffer", mvo.getSendQCount()); jo2.put("Use", sivo.isUseFlag()); int sport = sivo.getPort(); JSONArray ja1 = new JSONArray(); if (sivo.getServiceClientCount() != 0) { Object[] keys = serverScInfoList.keySet().toArray(); for (int j = 0; j < keys.length; j++) { ServiceClientVO scvo = serverScInfoList.get(keys[j]); MonitorInfoVO mvo2 = scvo.getMonitorInfoVO(); JSONObject jo1 = new JSONObject(); int scport = scvo.getServerPort(); if (sport == scport) { jo1.put("ID", scvo.getId()); jo1.put("ServiceName", scvo.getName()); jo1.put("ServiceIP", scvo.getIp()); jo1.put("ServicePort", scvo.getServicePort()); jo1.put("SendBuffer", scvo.getReSendQ().size()); jo1.put("Connect", mvo2.isConnected()); ja1.add(jo1); } } } jo2.put("SC", ja1); data.add(jo2); } return data; } @SuppressWarnings("unchecked") @GetMapping(value = "/rest/clientStatus") public JSONArray loadClientStatusInfo() throws Exception { JSONArray data = new JSONArray(); for (int i = 0; i < clientInfoList.size(); i++) { ClientInfoVO civo = clientInfoList.get(i); MonitorInfoVO cimvo = civo.getMonitorInfo(); if (!civo.isiSUse()) { continue; } JSONObject jo1 = new JSONObject(); jo1.put("ID", civo.getId()); jo1.put("ClientName", civo.getName()); switch (civo.getActive().getName()) { case "PRIMARY": jo1.put("Active", 0); jo1.put("IP", civo.getIp()); break; case "SECONDARY": jo1.put("Active", 1); jo1.put("IP", civo.getsIp()); break; } jo1.put("Port", civo.getPort()); jo1.put("SendBuffer", cimvo.getSendQCount()); jo1.put("RecvBuffer", cimvo.getRecvQCount()); jo1.put("Connect", cimvo.isConnected()); data.add(jo1); } return data; } @SuppressWarnings("unchecked") @GetMapping(value = "/rest/systemStatus") public JSONObject loadSystemStatusInfo() throws Exception { JSONObject data = new JSONObject(); data.put("RecvBuffer", getRcvBuffer()); data.put("SendBuffer", getSndBuffer()); data.put("Start", startTime); return data; } }