882 lines
26 KiB
Java
882 lines
26 KiB
Java
|
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<String, ArrayList<String>> packetMap;
|
||
|
|
||
|
@Resource(name = "packetQ")
|
||
|
Queue<String> 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<String> 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<String> sendQue = new LinkedList<String>();
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
}
|