main
MonHun 2023-10-10 11:42:11 +09:00
parent c11b6c8635
commit 8dd797edcf
24 changed files with 5003 additions and 4392 deletions

View File

@ -7,7 +7,9 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.ApplicationPidFileWriter;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication
public class DevApplication {
// implements CommandLineRunner

View File

@ -1,146 +1,146 @@
package kr.gmtc.gw.dev.asderecv.asde.asterix;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Queue;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceAsdeData;
import kr.gmtc.gw.dev.asderecv.asde.utils.AsdeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.databind.ObjectMapper;
@Component("asterixParserThread")
public class AsterixParserThread {
// @Autowired
private AsterixParser asterixParser;
// @Autowired
// private FMDecoder fmDecoder;
//
private Logger logger = LoggerFactory.getLogger(AsterixParserThread.class);
private boolean isRunning = true;
private Thread thread;
private int processCount = 0;
private int MAX_PROCESS_COUNT = 100;
@Value("${asde.service.queueCount}")
private Integer scvQcount;
@Value("${spring.profiles.active}")
private String execMode;
List<ServiceAsdeData> serviceMap;
ObjectMapper mapper;
DateTimeFormatter dfPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
int recvCnt;
public AsterixParserThread(Queue<String> packetQ, HashMap<Integer, Queue<ServiceAsdeData>> sendQueue) {
thread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
String packetMsg = "";
try {
packetMsg = packetQ.poll();
if (packetMsg != null) {
// 테스트용
//String sBynary = "0A 05 BB E3 81 F1 91 03 8A 06 04 98 3C 00 C1 D9 F5 28 0E 72 45 54 48 33 36 36 37 20 04 01 68 45 54 41 57 45 20 20 20 02 8D 36 34 39 20 00 33 34 52 0B 8F 08 EB 81 71 01 03 02 06 04 98 41 00 D3 95 20 50 08 06 E8 41 46 4C 36 20 20 20 20 71 D1 48 53 49 41 31 34 38 20 20 08 20 EB 81 01 01 03 02 06 04 98 3D C1 CF 75 18 D7 01 00 E0 02 E0 EB 81 71 01 03 02 06 04 98 40 C1 EA EC E5 80 00 00 E8 46 49 52 45 35 20 20 20 71 D1 08 53 49 41 31 30 38 20 20 08 20 EB 81 01 01 03 02 06 04 98 3C 45 E9 6B EC FB 00 00 E0 02 E0 E3 81 81 81 03 02 06 04 98 3F C5 A3 C8 F1 38 06 03 02 AC 00 20 E3 81 81 81 03 02 06 04 98 41 05 46 90 F1 38 06 02 02 6A 00 20 EB 81 F1 91 03 8A 06 04 98 3E 46 E3 86 26 F7 F9 FB F2 07 E3 54 57 42 32 39 32 20 20 71 C3 24 48 4C 38 33 32 34 20 20 3F FE 31 32 39 20 02 33 33 52 04 A7 08 EB 81 F1 11 03 0A 06 04 98 3F 86 D5 73 10 DC FF 00 F8 04 00 4B 41 53 38 20 20 20 20 71 C2 12 48 4C 38 32 31 32 20 20 35 34 36 20 02 04 9A 08 EB 81 01 01 03 02 06 04 98 40 07 CB 78 28 01 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 3C CB D6 2D 0F 8A 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 3B 8E D3 69 14 D5 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 30 51 E8 81 14 CC 00 00 E0 00 E0 EB 81 F1 91 03 8A 06 04 98 3E 12 DA FA 58 54 A1 07 F5 20 08 CF 4B 41 4C 35 35 31 20 20 71 BE 01 48 4C 37 36 30 31 20 20 00 6C 36 30 39 20 00 33 34 52 06 A5 08 E3 81 F1 91 03 8A 06 04 98 3C 14 E4 E6 F5 28 0E 73 41 49 48 32 32 31 20 20 71 C5 03 48 4C 38 35 30 33 20 20 02 73 36 31 36 20 00 33 34 52 05 B4 08 EB 81 F1 91 03 8A 06 04 98 3E 14 D1 26 0E 46 03 02 F2 09 1B 43 53 4E 33 30 36 31 20 78 1D AC 42 33 32 39 53 20 20 20 3F FE 31 32 34 20 02 33 34 4C 04 A6 08 EB 81 01 01 03 02 06 04 98 42 D8 CC 92 18 B2 00 00 E0 00 E0 EB 81 01 01 03 02 06 04 98 35 98 DE 2A 14 0B 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 3E DA 0B 2E 16 DE FF 00 E0 00 E0 EB 81 01 01 03 02 06 04 98 40 9A DE FC 21 72 00 00 E0 00 E0 EB 81 01 01 03 02 06 04 98 27 5C D3 D8 32 98 00 00 E0 00 E0 EB 81 F1 91 03 8A 06 04 98 3E 9C D4 72 FA 1A E4 27 F2 07 A8 4B 41 4C 37 35 36 20 20 71 C2 76 48 4C 38 32 37 36 20 20 3F FD 32 34 36 20 02 33 34 4C 04 A8 08 EB 81 01 01 03 02 06 04 98 3F A0 EC 22 01 A7 00 00 E0 02 E0 EB 81 F1 91 83 8A 06 04 98 3E A1 2A 7C CF 65 D6 3B F2 06 BD 4A 4E 41 32 38 32 20 20 71 BF 57 48 4C 37 37 35 37 20 20 00 1D 32 30 20 20 80 71 33 33 52 00 33 33 52 04 A9 08 EB 81 F1 91 03 8A 06 04 98 40 22 05 38 14 50 FC FD F4 0E 70 47 45 43 38 33 39 31 20 3C 70 C9 44 41 4C 46 49 20 20 20 3F FF 36 33 33 20 02 33 34 52 04 23 08 EB 81 01 01 03 02 06 04 98 3F E4 EF 9C 04 0B 00 00 E0 00 E0 EB 81 71 01 03 02 06 04 98 3C E5 D9 E1 09 F9 FD 09 E8 53 41 46 45 54 59 31 20 71 D1 13 53 49 41 31 31 33 20 20 0A 20 EB 81 01 01 03 02 06 04 98 3F E5 EE CB FA B5 00 00 E0 00 E0 EB 81 F1 91 03 8A 06 04 98 3D 66 FE 13 13 E4 08 F5 F2 08 F2 43 59 5A 32 33 31 41 20 78 05 CA 42 32 38 38 31 20 20 20 3F FE 36 30 34 20 02 33 33 52 04 A4 08 EB 81 F1 91 03 8A 06 04 98 3F 66 F8 39 07 39 FB FD F4 0E 63 46 44 58 35 33 39 31 20 AC 25 C4 4E 38 38 32 46 44 20 20 3F FE 36 35 32 20 02 33 34 52 08 97 08 EB 81 E1 81 03 02 06 04 98 3B 28 10 A1 72 50 C4 44 F1 10 00 C1 48 4C 35 32 33 39 20 20 71 AA 39 01 6C 00 20 E3 81 F1 91 03 8A 06 04 98 3E 68 86 EA F5 20 0E 5D 44 4C 48 37 31 39 20 20 3C 67 0E 44 41 49 58 4E 20 20 20 00 6B 33 32 20 20 00 33 34 52 04 24 08 EB 81 01 01 03 02 06 04 98 41 29 CA 2D 1A CC 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 39 2A 07 DB 16 5D 00 00 E0 00 E0 EB 81 01 01 03 02 06 04 98 3D ED 0D E0 18 E4 00 00 E0 00 E0 EB 81 01 01 03 02 06 04 98 2A AF CB D2 26 53 00 00 E0 02 E0 EB 81 F1 11 03 02 06 04 98 3A EF 0D 76 04 91 00 00 F2 08 E4 42 33 32 37 37 20 20 20 78 11 D5 42 33 32 37 37 20 20 20 38 34 32 20 02 E0 EB 81 01 01 03 02 06 04 98 3C 2F EA 89 ED 0F 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 3B F2 CA 19 24 BF 03 03 E0 02 E0 EB 81 01 01 03 02 06 04 98 41 34 0F 9F 1B C5 00 00 E0 00 E0 EB 81 71 01 03 02 06 04 98 3D B7 01 C9 F6 FB FF FF E8 46 49 52 45 33 20 20 20 71 D1 09 53 49 41 31 30 39 20 20 08 20 EB 81 01 01 03 02 06 04 98 3D F8 D4 C1 12 10 00 00 E0 02 E0 E3 81 81 81 03 02 06 04 98 40 39 4E BC F1 38 06 01 02 44 00 20 EB 81 F1 91 03 8A 06 04 98 3D BA DA EC 01 57 05 F8 F2 06 A6 41 41 52 31 31 31 20 20 71 BF 92 48 4C 37 37 39 32 20 20 3F FE 32 31 20 20 02 33 34 4C 04 A2 08 EB 81 E1 81 03 02 06 04 98 3D BC 13 53 7B 69 C7 58 F1 30 0F 14 4A 4E 41 33 38 30 20 20 71 C0 14 02 29 00 20 EB 81 01 01 03 02 06 04 98 3D 7F 11 2A 1B 1E 00 00 E0 00 E0 ";
//sBynary = sBynary.replaceAll("\\p{Z}", "");
// UDP 수신데이터
String sBynary = packetMsg.replaceAll("\\p{Z}", "");
String sTime = null;
//sBynary = "0b00b5df5d6b02000501352f1a1aa4cbe959e6d555f35b05ddffe90021086840780fec074a410110000bffff00004fcc43455335303334413332314d524b53495a53504431364c0308071400100714004008380031323820202034520033f580472c43455335303334440000000000000000000000000000000000000000041000c9434553353033342020200001df0d0102000501352f561aa3b0e359ed549fffb0033bffff00000fcb010009520008902fba00d9";
// 수신시각
if(sBynary.indexOf("*") > 0) {
sTime = packetMsg.substring(packetMsg.indexOf("*") +1);
sBynary = sBynary.substring(0, sBynary.indexOf("*"));
}else {
sTime = LocalDateTime.now().format(dfPattern);
}
// 수신 메시지(Hex) byte로 변환
byte[] data = new java.math.BigInteger(sBynary, 16).toByteArray();
recvCnt ++;
// byte문자열 혹인
// logger.writeLevelLog("[AsterixParserThread] ByteArray(" + recvCnt + "):" + packetMsg, LogLevelType.LOG_DEBUG, "AllLog");
// 수신메시지 파싱
List<LinkedHashMap<String,String>> result = asterixParser.parse(data, sTime);
// logger.info("[ASDE분석결과:"+LocalDateTime.now().format(dfPattern)+"] result = "+ result);
logger.info("[ASDE분석결과(service):"+LocalDateTime.now().format(dfPattern)+"] serviceMap = "+ Arrays.deepToString(serviceMap.toArray()));
if(!serviceMap.isEmpty()) {
for(int idx=0; idx<serviceMap.size(); idx++) {
for(int qi=0; qi<scvQcount; qi++) {
sendQueue.get(qi).offer(serviceMap.get(idx));
}
}
serviceMap.clear();
}
}
} catch (Exception e) {
if (e.getMessage() != null) {
logger.error("[AsterixParserThread] Parsing Error Message : " + AsdeUtil.getStatckTrace(e));
logger.error("=> Packet Message : " + packetMsg);
} else {
logger.error("[AsterixParserThread] Parsing Error Packet Message :" + packetMsg);
}
} finally {
processCount++;
try {
if (processCount > MAX_PROCESS_COUNT) {
processCount = 0;
}
Thread.sleep(1);
} catch (InterruptedException e) {
logger.error("[ParserThread] : " + AsdeUtil.getStatckTrace(e));
}
}
}
}
});
}
public void start() {
serviceMap = new ArrayList<ServiceAsdeData>();
// Asterix Parser 객체 생성 (category별로 상이한 yaml파일의 spec내용을 로드)
asterixParser = new AsterixParser(serviceMap, execMode);
mapper = new ObjectMapper();
isRunning = true;
thread.start();
}
}
package kr.gmtc.gw.dev.asderecv.asde.asterix;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Queue;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceAsdeData;
import kr.gmtc.gw.dev.asderecv.asde.utils.AsdeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.databind.ObjectMapper;
@Component("asterixParserThread")
public class AsterixParserThread {
// @Autowired
private AsterixParser asterixParser;
// @Autowired
// private FMDecoder fmDecoder;
//
private Logger logger = LoggerFactory.getLogger(AsterixParserThread.class);
private boolean isRunning = true;
private Thread thread;
private int processCount = 0;
private int MAX_PROCESS_COUNT = 100;
@Value("${asde.service.queueCount}")
private Integer scvQcount;
@Value("${spring.profiles.active}")
private String execMode;
List<ServiceAsdeData> serviceMap;
ObjectMapper mapper;
DateTimeFormatter dfPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
int recvCnt;
public AsterixParserThread(Queue<String> packetQ, HashMap<Integer, Queue<ServiceAsdeData>> sendQueue) {
thread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
String packetMsg = "";
try {
packetMsg = packetQ.poll();
if (packetMsg != null) {
// 테스트용
//String sBynary = "0A 05 BB E3 81 F1 91 03 8A 06 04 98 3C 00 C1 D9 F5 28 0E 72 45 54 48 33 36 36 37 20 04 01 68 45 54 41 57 45 20 20 20 02 8D 36 34 39 20 00 33 34 52 0B 8F 08 EB 81 71 01 03 02 06 04 98 41 00 D3 95 20 50 08 06 E8 41 46 4C 36 20 20 20 20 71 D1 48 53 49 41 31 34 38 20 20 08 20 EB 81 01 01 03 02 06 04 98 3D C1 CF 75 18 D7 01 00 E0 02 E0 EB 81 71 01 03 02 06 04 98 40 C1 EA EC E5 80 00 00 E8 46 49 52 45 35 20 20 20 71 D1 08 53 49 41 31 30 38 20 20 08 20 EB 81 01 01 03 02 06 04 98 3C 45 E9 6B EC FB 00 00 E0 02 E0 E3 81 81 81 03 02 06 04 98 3F C5 A3 C8 F1 38 06 03 02 AC 00 20 E3 81 81 81 03 02 06 04 98 41 05 46 90 F1 38 06 02 02 6A 00 20 EB 81 F1 91 03 8A 06 04 98 3E 46 E3 86 26 F7 F9 FB F2 07 E3 54 57 42 32 39 32 20 20 71 C3 24 48 4C 38 33 32 34 20 20 3F FE 31 32 39 20 02 33 33 52 04 A7 08 EB 81 F1 11 03 0A 06 04 98 3F 86 D5 73 10 DC FF 00 F8 04 00 4B 41 53 38 20 20 20 20 71 C2 12 48 4C 38 32 31 32 20 20 35 34 36 20 02 04 9A 08 EB 81 01 01 03 02 06 04 98 40 07 CB 78 28 01 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 3C CB D6 2D 0F 8A 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 3B 8E D3 69 14 D5 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 30 51 E8 81 14 CC 00 00 E0 00 E0 EB 81 F1 91 03 8A 06 04 98 3E 12 DA FA 58 54 A1 07 F5 20 08 CF 4B 41 4C 35 35 31 20 20 71 BE 01 48 4C 37 36 30 31 20 20 00 6C 36 30 39 20 00 33 34 52 06 A5 08 E3 81 F1 91 03 8A 06 04 98 3C 14 E4 E6 F5 28 0E 73 41 49 48 32 32 31 20 20 71 C5 03 48 4C 38 35 30 33 20 20 02 73 36 31 36 20 00 33 34 52 05 B4 08 EB 81 F1 91 03 8A 06 04 98 3E 14 D1 26 0E 46 03 02 F2 09 1B 43 53 4E 33 30 36 31 20 78 1D AC 42 33 32 39 53 20 20 20 3F FE 31 32 34 20 02 33 34 4C 04 A6 08 EB 81 01 01 03 02 06 04 98 42 D8 CC 92 18 B2 00 00 E0 00 E0 EB 81 01 01 03 02 06 04 98 35 98 DE 2A 14 0B 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 3E DA 0B 2E 16 DE FF 00 E0 00 E0 EB 81 01 01 03 02 06 04 98 40 9A DE FC 21 72 00 00 E0 00 E0 EB 81 01 01 03 02 06 04 98 27 5C D3 D8 32 98 00 00 E0 00 E0 EB 81 F1 91 03 8A 06 04 98 3E 9C D4 72 FA 1A E4 27 F2 07 A8 4B 41 4C 37 35 36 20 20 71 C2 76 48 4C 38 32 37 36 20 20 3F FD 32 34 36 20 02 33 34 4C 04 A8 08 EB 81 01 01 03 02 06 04 98 3F A0 EC 22 01 A7 00 00 E0 02 E0 EB 81 F1 91 83 8A 06 04 98 3E A1 2A 7C CF 65 D6 3B F2 06 BD 4A 4E 41 32 38 32 20 20 71 BF 57 48 4C 37 37 35 37 20 20 00 1D 32 30 20 20 80 71 33 33 52 00 33 33 52 04 A9 08 EB 81 F1 91 03 8A 06 04 98 40 22 05 38 14 50 FC FD F4 0E 70 47 45 43 38 33 39 31 20 3C 70 C9 44 41 4C 46 49 20 20 20 3F FF 36 33 33 20 02 33 34 52 04 23 08 EB 81 01 01 03 02 06 04 98 3F E4 EF 9C 04 0B 00 00 E0 00 E0 EB 81 71 01 03 02 06 04 98 3C E5 D9 E1 09 F9 FD 09 E8 53 41 46 45 54 59 31 20 71 D1 13 53 49 41 31 31 33 20 20 0A 20 EB 81 01 01 03 02 06 04 98 3F E5 EE CB FA B5 00 00 E0 00 E0 EB 81 F1 91 03 8A 06 04 98 3D 66 FE 13 13 E4 08 F5 F2 08 F2 43 59 5A 32 33 31 41 20 78 05 CA 42 32 38 38 31 20 20 20 3F FE 36 30 34 20 02 33 33 52 04 A4 08 EB 81 F1 91 03 8A 06 04 98 3F 66 F8 39 07 39 FB FD F4 0E 63 46 44 58 35 33 39 31 20 AC 25 C4 4E 38 38 32 46 44 20 20 3F FE 36 35 32 20 02 33 34 52 08 97 08 EB 81 E1 81 03 02 06 04 98 3B 28 10 A1 72 50 C4 44 F1 10 00 C1 48 4C 35 32 33 39 20 20 71 AA 39 01 6C 00 20 E3 81 F1 91 03 8A 06 04 98 3E 68 86 EA F5 20 0E 5D 44 4C 48 37 31 39 20 20 3C 67 0E 44 41 49 58 4E 20 20 20 00 6B 33 32 20 20 00 33 34 52 04 24 08 EB 81 01 01 03 02 06 04 98 41 29 CA 2D 1A CC 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 39 2A 07 DB 16 5D 00 00 E0 00 E0 EB 81 01 01 03 02 06 04 98 3D ED 0D E0 18 E4 00 00 E0 00 E0 EB 81 01 01 03 02 06 04 98 2A AF CB D2 26 53 00 00 E0 02 E0 EB 81 F1 11 03 02 06 04 98 3A EF 0D 76 04 91 00 00 F2 08 E4 42 33 32 37 37 20 20 20 78 11 D5 42 33 32 37 37 20 20 20 38 34 32 20 02 E0 EB 81 01 01 03 02 06 04 98 3C 2F EA 89 ED 0F 00 00 E0 02 E0 EB 81 01 01 03 02 06 04 98 3B F2 CA 19 24 BF 03 03 E0 02 E0 EB 81 01 01 03 02 06 04 98 41 34 0F 9F 1B C5 00 00 E0 00 E0 EB 81 71 01 03 02 06 04 98 3D B7 01 C9 F6 FB FF FF E8 46 49 52 45 33 20 20 20 71 D1 09 53 49 41 31 30 39 20 20 08 20 EB 81 01 01 03 02 06 04 98 3D F8 D4 C1 12 10 00 00 E0 02 E0 E3 81 81 81 03 02 06 04 98 40 39 4E BC F1 38 06 01 02 44 00 20 EB 81 F1 91 03 8A 06 04 98 3D BA DA EC 01 57 05 F8 F2 06 A6 41 41 52 31 31 31 20 20 71 BF 92 48 4C 37 37 39 32 20 20 3F FE 32 31 20 20 02 33 34 4C 04 A2 08 EB 81 E1 81 03 02 06 04 98 3D BC 13 53 7B 69 C7 58 F1 30 0F 14 4A 4E 41 33 38 30 20 20 71 C0 14 02 29 00 20 EB 81 01 01 03 02 06 04 98 3D 7F 11 2A 1B 1E 00 00 E0 00 E0 ";
//sBynary = sBynary.replaceAll("\\p{Z}", "");
// UDP 수신데이터
String sBynary = packetMsg.replaceAll("\\p{Z}", "");
String sTime = null;
//sBynary = "0b00b5df5d6b02000501352f1a1aa4cbe959e6d555f35b05ddffe90021086840780fec074a410110000bffff00004fcc43455335303334413332314d524b53495a53504431364c0308071400100714004008380031323820202034520033f580472c43455335303334440000000000000000000000000000000000000000041000c9434553353033342020200001df0d0102000501352f561aa3b0e359ed549fffb0033bffff00000fcb010009520008902fba00d9";
// 수신시각
if(sBynary.indexOf("*") > 0) {
sTime = packetMsg.substring(packetMsg.indexOf("*") +1);
sBynary = sBynary.substring(0, sBynary.indexOf("*"));
}else {
sTime = LocalDateTime.now().format(dfPattern);
}
// 수신 메시지(Hex) byte로 변환
byte[] data = new java.math.BigInteger(sBynary, 16).toByteArray();
recvCnt ++;
// byte문자열 혹인
// logger.writeLevelLog("[AsterixParserThread] ByteArray(" + recvCnt + "):" + packetMsg, LogLevelType.LOG_DEBUG, "AllLog");
// 수신메시지 파싱
List<LinkedHashMap<String,String>> result = asterixParser.parse(data, sTime);
// logger.info("[ASDE분석결과:"+LocalDateTime.now().format(dfPattern)+"] result = "+ result);
logger.info("[ASDE분석결과(service):"+LocalDateTime.now().format(dfPattern)+"] serviceMap = "+ Arrays.deepToString(serviceMap.toArray()));
if(!serviceMap.isEmpty()) {
for(int idx=0; idx<serviceMap.size(); idx++) {
for(int qi=0; qi<scvQcount; qi++) {
sendQueue.get(qi).offer(serviceMap.get(idx));
}
}
serviceMap.clear();
}
}
} catch (Exception e) {
if (e.getMessage() != null) {
logger.error("[AsterixParserThread] Parsing Error Message : " + AsdeUtil.getStatckTrace(e));
logger.error("=> Packet Message : " + packetMsg);
} else {
logger.error("[AsterixParserThread] Parsing Error Packet Message :" + packetMsg);
}
} finally {
processCount++;
try {
if (processCount > MAX_PROCESS_COUNT) {
processCount = 0;
}
Thread.sleep(1);
} catch (InterruptedException e) {
logger.error("[ParserThread] : " + AsdeUtil.getStatckTrace(e));
}
}
}
}
});
}
public void start() {
serviceMap = new ArrayList<ServiceAsdeData>();
// Asterix Parser 객체 생성 (category별로 상이한 yaml파일의 spec내용을 로드)
asterixParser = new AsterixParser(serviceMap, execMode);
mapper = new ObjectMapper();
isRunning = true;
thread.start();
}
}

View File

@ -1,63 +1,63 @@
package kr.gmtc.gw.dev.asderecv.asde.asterix;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.LinkedHashMap;
import org.json.simple.JSONObject;
import org.yaml.snakeyaml.Yaml;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class YamlFileLoader {
private Object returnObj;
/**
* yamlLoadToVo()
* yaml JSON vo
*
* @param sFile - yaml
* @param cVO - yaml VO
* @return Object VO casting
* @throws Json Object .
* @date 2023.02.07
*
*/
public <T> T yamlLoadToVo(String sFile, Class<T> cVO) {
if(sFile == null || sFile.equals("")) return cVO.cast(returnObj);
try {
InputStream is = this.getClass().getResourceAsStream("/" + sFile);
Reader reader = (is != null ? new InputStreamReader(is) : new FileReader(sFile));
// yaml 파일 로드
//LinkedHashMap<String, Object> propMap = new Yaml().load(new FileReader(ResourceUtils.getFile(sFile)));
LinkedHashMap<String, Object> propMap = new Yaml().load(reader);
// 파일내용을 JSON 포멧으로 변환
JSONObject jsonObject = new JSONObject(propMap);
// JSON 데이터를 Object로 변환
ObjectMapper objectMapper = new ObjectMapper();
// Array Null값, 중간중간 존재하지 않는 필드 무시
objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT);
objectMapper.configure(DeserializationFeature.FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY, false);
returnObj = objectMapper.readValue(jsonObject.toJSONString(), cVO);
} catch (Exception e) {
e.printStackTrace();
}
return cVO.cast(returnObj);
}
}
package kr.gmtc.gw.dev.asderecv.asde.asterix;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.LinkedHashMap;
import org.json.simple.JSONObject;
import org.yaml.snakeyaml.Yaml;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class YamlFileLoader {
private Object returnObj;
/**
* yamlLoadToVo()
* yaml JSON vo
*
* @param sFile - yaml
* @param cVO - yaml VO
* @return Object VO casting
* @throws Json Object .
* @date 2023.02.07
*
*/
public <T> T yamlLoadToVo(String sFile, Class<T> cVO) {
if(sFile == null || sFile.equals("")) return cVO.cast(returnObj);
try {
InputStream is = this.getClass().getResourceAsStream("/" + sFile);
Reader reader = (is != null ? new InputStreamReader(is) : new FileReader(sFile));
// yaml 파일 로드
//LinkedHashMap<String, Object> propMap = new Yaml().load(new FileReader(ResourceUtils.getFile(sFile)));
LinkedHashMap<String, Object> propMap = new Yaml().load(reader);
// 파일내용을 JSON 포멧으로 변환
JSONObject jsonObject = new JSONObject(propMap);
// JSON 데이터를 Object로 변환
ObjectMapper objectMapper = new ObjectMapper();
// Array Null값, 중간중간 존재하지 않는 필드 무시
objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT);
objectMapper.configure(DeserializationFeature.FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY, false);
returnObj = objectMapper.readValue(jsonObject.toJSONString(), cVO);
} catch (Exception e) {
e.printStackTrace();
}
return cVO.cast(returnObj);
}
}

View File

@ -1,123 +1,123 @@
package kr.gmtc.gw.dev.asderecv.asde.controller;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
import javax.annotation.Resource;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.AsdeServiceVO;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceAsdeData;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceHeader;
import kr.gmtc.gw.dev.asderecv.config.ServiceConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@RestController
@Component("AsdeServiceController")
public class AsdeServiceController{
// 프레임 워크 구성요소 //
/** 서비스 설정, {@code application.yml} */
@Resource(name = "ServiceConfig")
private ServiceConfig serviceConfig;
/* 실생상태 확인 */
private boolean running = false;
/* UDP test 소켓 */
//UDPEchoClient UDPSocket ;
@Resource(name = "sendQueue")
HashMap<Integer, Queue<ServiceAsdeData>> sendQueue;
Queue<ServiceAsdeData> testMap = new LinkedBlockingQueue<ServiceAsdeData>();
/* 서비스중인지 확인 */
@Resource(name = "serviceRunnig")
private boolean serviceRunnig = false;
@Value("${asde.service.queueCount}")
private Integer scvQcount;
@Value("${asde.service.serviceCount}")
private Integer scvDatacount;
private AsdeServiceVO asdeServiceVO;
@SuppressWarnings("deprecation")
@GetMapping(value = "/getASDE/{qid}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String getASDE( @PathVariable Integer qid) {
String sendCode, sendMsg ;
ServiceHeader jsonHeader = new ServiceHeader();
List<ServiceAsdeData> jsonData = new ArrayList<ServiceAsdeData>();
sendCode = "200";
sendMsg = "";
asdeServiceVO = new AsdeServiceVO();
int idx = qid -1;
long qSize = sendQueue.get(idx).size();
if(qSize > 0) serviceRunnig = true ;
if(qSize > scvDatacount) qSize = scvDatacount;
if(qid > scvQcount || qid <= 0) {
sendCode = "Err-01";
sendMsg = "할당되지 않은 큐를 지정했습니다.";
// retList.add(sendMsg);
}else {
if(sendQueue.get(idx).peek() == null) {
sendCode = "200";
sendMsg = "전송할 데이터 없음.";
// retList.add(sendMsg);
}else{
while (qSize > 0 ) {
jsonData.add(sendQueue.get(idx).poll());
qSize--;
}
}
}
jsonHeader.setResult_code(sendCode);
jsonHeader.setResult_msg(sendMsg);
asdeServiceVO.setHeader(jsonHeader);
if (sendCode.equals("200")) {
asdeServiceVO.setData(jsonData);
}
ObjectMapper mapper = new ObjectMapper();
String sTmp = "";
try {
sTmp = mapper.writeValueAsString(asdeServiceVO);
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
serviceRunnig = false ;
return sTmp;
}
}
package kr.gmtc.gw.dev.asderecv.asde.controller;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
import javax.annotation.Resource;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.AsdeServiceVO;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceAsdeData;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceHeader;
import kr.gmtc.gw.dev.asderecv.config.ServiceConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@RestController
@Component("AsdeServiceController")
public class AsdeServiceController{
// 프레임 워크 구성요소 //
/** 서비스 설정, {@code application.yml} */
@Resource(name = "ServiceConfig")
private ServiceConfig serviceConfig;
/* 실생상태 확인 */
private boolean running = false;
/* UDP test 소켓 */
//UDPEchoClient UDPSocket ;
@Resource(name = "sendQueue")
HashMap<Integer, Queue<ServiceAsdeData>> sendQueue;
Queue<ServiceAsdeData> testMap = new LinkedBlockingQueue<ServiceAsdeData>();
/* 서비스중인지 확인 */
@Resource(name = "serviceRunnig")
private boolean serviceRunnig = false;
@Value("${asde.service.queueCount}")
private Integer scvQcount;
@Value("${asde.service.serviceCount}")
private Integer scvDatacount;
private AsdeServiceVO asdeServiceVO;
@SuppressWarnings("deprecation")
@GetMapping(value = "/getASDE/{qid}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String getASDE( @PathVariable Integer qid) {
String sendCode, sendMsg ;
ServiceHeader jsonHeader = new ServiceHeader();
List<ServiceAsdeData> jsonData = new ArrayList<ServiceAsdeData>();
sendCode = "200";
sendMsg = "";
asdeServiceVO = new AsdeServiceVO();
int idx = qid -1;
long qSize = sendQueue.get(idx).size();
if(qSize > 0) serviceRunnig = true ;
if(qSize > scvDatacount) qSize = scvDatacount;
if(qid > scvQcount || qid <= 0) {
sendCode = "Err-01";
sendMsg = "할당되지 않은 큐를 지정했습니다.";
// retList.add(sendMsg);
}else {
if(sendQueue.get(idx).peek() == null) {
sendCode = "200";
sendMsg = "전송할 데이터 없음.";
// retList.add(sendMsg);
}else{
while (qSize > 0 ) {
jsonData.add(sendQueue.get(idx).poll());
qSize--;
}
}
}
jsonHeader.setResult_code(sendCode);
jsonHeader.setResult_msg(sendMsg);
asdeServiceVO.setHeader(jsonHeader);
if (sendCode.equals("200")) {
asdeServiceVO.setData(jsonData);
}
ObjectMapper mapper = new ObjectMapper();
String sTmp = "";
try {
sTmp = mapper.writeValueAsString(asdeServiceVO);
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
serviceRunnig = false ;
return sTmp;
}
}

View File

@ -1,16 +1,16 @@
package kr.gmtc.gw.dev.asderecv.asde.controller;
import java.util.HashMap;
import java.util.Queue;
import org.springframework.stereotype.Component;
import kr.gmtc.gw.dev.asderecv.asde.asterix.AsterixParserThread;
@Component("parseController")
public class ParseController {
public ParseController(Queue<String> packetQ, HashMap<Integer, Queue<String>> sendQueue, AsterixParserThread asterixParserThread) {
asterixParserThread.start();
}
}
package kr.gmtc.gw.dev.asderecv.asde.controller;
import java.util.HashMap;
import java.util.Queue;
import org.springframework.stereotype.Component;
import kr.gmtc.gw.dev.asderecv.asde.asterix.AsterixParserThread;
@Component("parseController")
public class ParseController {
public ParseController(Queue<String> packetQ, HashMap<Integer, Queue<String>> sendQueue, AsterixParserThread asterixParserThread) {
asterixParserThread.start();
}
}

View File

@ -1,14 +1,14 @@
package kr.gmtc.gw.dev.asderecv.asde.utils;
import java.io.PrintWriter;
import java.io.StringWriter;
public class AsdeUtil {
public static String getStatckTrace(Throwable t) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
}
package kr.gmtc.gw.dev.asderecv.asde.utils;
import java.io.PrintWriter;
import java.io.StringWriter;
public class AsdeUtil {
public static String getStatckTrace(Throwable t) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
}

View File

@ -1,51 +1,51 @@
package kr.gmtc.gw.dev.asderecv.asde.utils;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;
public class FieldNameReflectionUtils {
public String getItem(Object obj, String sFieldName) {
String sRetValue = "";
Field field = ReflectionUtils.findField(obj.getClass(), sFieldName);
if(field != null) {
field.setAccessible(true);
try {
sRetValue = (String) ReflectionUtils.getField(field, obj);
} catch (Exception e) {
e.printStackTrace();
}
}
return sRetValue;
}
public void setItem(Object obj, String sFieldName, String sValue) {
Field field = ReflectionUtils.findField(obj.getClass(), sFieldName);
if(field != null) {
field.setAccessible(true);
try {
ReflectionUtils.setField(field, obj, sValue);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package kr.gmtc.gw.dev.asderecv.asde.utils;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;
public class FieldNameReflectionUtils {
public String getItem(Object obj, String sFieldName) {
String sRetValue = "";
Field field = ReflectionUtils.findField(obj.getClass(), sFieldName);
if(field != null) {
field.setAccessible(true);
try {
sRetValue = (String) ReflectionUtils.getField(field, obj);
} catch (Exception e) {
e.printStackTrace();
}
}
return sRetValue;
}
public void setItem(Object obj, String sFieldName, String sValue) {
Field field = ReflectionUtils.findField(obj.getClass(), sFieldName);
if(field != null) {
field.setAccessible(true);
try {
ReflectionUtils.setField(field, obj, sValue);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

View File

@ -1,91 +1,91 @@
package kr.gmtc.gw.dev.asderecv.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceAsdeData;
import javax.annotation.PostConstruct;
import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
@Configuration("ServiceConfig")
public class ServiceConfig {
@Value("${root}")
private String root;
// @Value("${tcpip.client.send}")
// private String clientSendCharsetStr;
// @Value("${tcpip.client.receive}")
// private String clientReceiveCharsetStr;
// @Value("${tcpip.client.checksum}")
// private boolean clientReceiveChecksum;
//
// @Value("${tcpip.server.send}")
// private String serverSendCharsetStr;
// @Value("${tcpip.server.receive}")
// private String serverReceiveCharsetStr;
// @Value("${tcpip.server.checksum}")
// private boolean serverReceiveChecksum;
private Charset clientReceiveCharset;
private Charset serverReceiveCharset;
private Charset clientSendCharset;
private Charset serverSendCharset;
@PostConstruct
private void initialize() {
// clientSendCharset = Charset.forName(clientReceiveCharsetStr);
// serverSendCharset = Charset.forName(serverReceiveCharsetStr);
// clientReceiveCharset = Charset.forName(clientReceiveCharsetStr);
// serverReceiveCharset = Charset.forName(serverReceiveCharsetStr);
}
// /** @return 프로그램 설치 경로 */
// public String getRoot() {
// return root;
// }
// /** @return 클라이언트 포트 송신 인코드 캐릭터셋 */
// public Charset getClientSendCharset() {
// return clientSendCharset;
// }
// /** @return 클라이언트 포트 수신 디코드 캐릭터셋 */
// public Charset getClientReceiveCharset() {
// return clientReceiveCharset;
// }
// /** @return 클라이언트 포트 수신 체크섬 검증 여부 */
// public boolean isClientReceiveChecksum() {
// return clientReceiveChecksum;
// }
// /** @return 서버 포트 송신 인코드 캐릭터셋 */
// public Charset getServerSendCharset() {
// return serverSendCharset;
// }
// /** @return 서버 포트 수신 디코드 캐릭터셋 */
// public Charset getServerReceiveCharset() {
// return serverReceiveCharset;
// }
// /** @return 서버 포트 수신 체크섬 검증 여부 */
// public boolean isServerReceiveChecksum() {
// return serverReceiveChecksum;
// }
@Bean(name = "packetQ")
public Queue<String> packetQ(){
return new LinkedBlockingQueue<String>();
}
@Bean(name = "sendQueue")
public HashMap<Integer, Queue<ServiceAsdeData>> sendQueue(){
return new LinkedHashMap<Integer, Queue<ServiceAsdeData>>();
}
@Bean(name = "serviceRunnig")
public boolean serviceRunnig(){
return false;
}
}
package kr.gmtc.gw.dev.asderecv.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceAsdeData;
import javax.annotation.PostConstruct;
import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
@Configuration("ServiceConfig")
public class ServiceConfig {
@Value("${root}")
private String root;
// @Value("${tcpip.client.send}")
// private String clientSendCharsetStr;
// @Value("${tcpip.client.receive}")
// private String clientReceiveCharsetStr;
// @Value("${tcpip.client.checksum}")
// private boolean clientReceiveChecksum;
//
// @Value("${tcpip.server.send}")
// private String serverSendCharsetStr;
// @Value("${tcpip.server.receive}")
// private String serverReceiveCharsetStr;
// @Value("${tcpip.server.checksum}")
// private boolean serverReceiveChecksum;
// private Charset clientReceiveCharset;
// private Charset serverReceiveCharset;
// private Charset clientSendCharset;
// private Charset serverSendCharset;
@PostConstruct
private void initialize() {
// clientSendCharset = Charset.forName(clientReceiveCharsetStr);
// serverSendCharset = Charset.forName(serverReceiveCharsetStr);
// clientReceiveCharset = Charset.forName(clientReceiveCharsetStr);
// serverReceiveCharset = Charset.forName(serverReceiveCharsetStr);
}
// /** @return 프로그램 설치 경로 */
// public String getRoot() {
// return root;
// }
// /** @return 클라이언트 포트 송신 인코드 캐릭터셋 */
// public Charset getClientSendCharset() {
// return clientSendCharset;
// }
// /** @return 클라이언트 포트 수신 디코드 캐릭터셋 */
// public Charset getClientReceiveCharset() {
// return clientReceiveCharset;
// }
// /** @return 클라이언트 포트 수신 체크섬 검증 여부 */
// public boolean isClientReceiveChecksum() {
// return clientReceiveChecksum;
// }
// /** @return 서버 포트 송신 인코드 캐릭터셋 */
// public Charset getServerSendCharset() {
// return serverSendCharset;
// }
// /** @return 서버 포트 수신 디코드 캐릭터셋 */
// public Charset getServerReceiveCharset() {
// return serverReceiveCharset;
// }
// /** @return 서버 포트 수신 체크섬 검증 여부 */
// public boolean isServerReceiveChecksum() {
// return serverReceiveChecksum;
// }
@Bean(name = "packetQ")
public Queue<String> packetQ(){
return new LinkedBlockingQueue<String>();
}
@Bean(name = "sendQueue")
public HashMap<Integer, Queue<ServiceAsdeData>> sendQueue(){
return new LinkedHashMap<Integer, Queue<ServiceAsdeData>>();
}
@Bean(name = "serviceRunnig")
public boolean serviceRunnig(){
return false;
}
}

View File

@ -1,363 +1,363 @@
package kr.gmtc.gw.dev.asderecv.controller;
import kr.gmtc.gw.comp.socket.udp.UDPEventListener;
import kr.gmtc.gw.comp.socket.udp.UDPManager;
import kr.gmtc.gw.comp.socket.utils.SocketUtil;
import kr.gmtc.gw.comp.socket.vo.MsgObjVO;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceAsdeData;
import kr.gmtc.gw.dev.asderecv.asde.utils.AsdeUtil;
import kr.gmtc.gw.dev.asderecv.thread.CustomThread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
@Component("controller")
public class MainController implements ApplicationListener<ContextClosedEvent> {
@Value("${root}")
private String path;
@Resource(name = "packetQ")
Queue<String> packetQ;
@Resource(name = "sendQueue")
HashMap<Integer, Queue<ServiceAsdeData>> sendQueue;
@Resource(name = "serviceRunnig")
private boolean serviceRunnig = false;
@Value("${asde.service.queueCount}")
private Integer scvQcount;
@Value("${asde.service.clearQ.maxCount}")
private Integer scvQmaxCount;
@Value("${asde.service.clearQ.diffTime}")
private Integer scvQdiffTime;
@Value("${asde.service.clearQ.clearTime}")
private Integer scvQclearTime;
private boolean isRunning;
protected UDPManager udpManager;
private UDPEventListener udpListener;
private ArrayBlockingQueue<MsgObjVO> recvQ;
private ArrayBlockingQueue<MsgObjVO> sendQ;
private Thread recvQThread;
private Thread sendQThread;
private CustomThread serviceQClearThread;
protected Logger logger;
protected MainController(@Value("${root}") String path){
isRunning = false;
logger = LoggerFactory.getLogger(MainController.class);
recvQ = new ArrayBlockingQueue<>(100000);
sendQ = new ArrayBlockingQueue<MsgObjVO>(100000);
udpListener = createUDPEventListener();
udpManager = new UDPManager(path, udpListener);
recvQThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
try {
int cnt = recvQ.size();
if (cnt > 1000) {
cnt = 1000;
}
for (int i = 0; i <= cnt - 1; i++) {
if (recvQ != null) {
MsgObjVO vo = recvQ.poll();
if (vo != null) {
recvDataIn(vo);
vo = null;
}
}
}
Thread.sleep(1);
} catch (InterruptedException e) {
logger.error(SocketUtil.getStatckTrace(e));
}
}
}
});
sendQThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
try {
int cnt = sendQ.size();
if (cnt > 1000) {
cnt = 1000;
}
for (int i = 0; i <= cnt - 1; i++) {
if (sendQ != null) {
MsgObjVO vo = sendQ.poll();
if (vo != null) {
sendDataIn(vo);
vo = null;
}
}
}
Thread.sleep(1);
} catch (InterruptedException e) {
logger.error(SocketUtil.getStatckTrace(e));
}
}
}
});
}
@Order(0)
@EventListener(ApplicationReadyEvent.class)
public void initialize() {
try {
// 전송용 Queue 생성
createQueue();
// 업무 스레드 생성, 대기 없이 무한반복
serviceQClearThread = new CustomThread("serviceQClearThread", this, CustomThread.NO_SLEEP, this::serviceQClear, null, false);
} catch(Exception e){
logger.error("[MainController] Prepare Fail " + AsdeUtil.getStatckTrace(e));
System.exit(1);
}
}
@Order(1)
@EventListener(ApplicationReadyEvent.class)
public void start() {
isRunning = true;
udpManager.initializeUDPFromXML();
udpManager.startClient();
recvQThread.start();
sendQThread.start();
}
public void stop() {
isRunning = false;
}
//////////////////////////////////////////////////////////////////////
protected UDPEventListener createUDPEventListener() {
UDPEventListener listener = new UDPEventListener() {
@Override
public void udpDataIn(MsgObjVO vo) {
// // TODO Auto-generated method stub
// throw new UnsupportedOperationException("Unimplemented method 'udpDataIn'");
//logger.info("RECV-DATA : " + vo.getMsg().toString());
recvPacketAdd(vo);
}
@Override
public void udpSendData(MsgObjVO vo) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'udpSendData'");
}
@Override
public void udpSendData(String ip, int port, MsgObjVO vo) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'udpSendData'");
}
@Override
public void connected(String ip, int port, int statusCode, String description) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'connected'");
}
@Override
public void disconnected(String ip, int port, int statusCode, String description) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'disconnected'");
}
@Override
public void connectionStatus(String ip, int port, String connEvent, int statusCode, String description) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'connectionStatus'");
}
};
return listener;
}
protected void recvPacketAdd(MsgObjVO vo) {
if (vo.getMsg().length < 1) {
return;
}
String recvDate = "";
try {
String msg = SocketUtil.byteArrayToHexString(vo.getMsg());
recvDate = vo.getRecvDT().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
msg = msg.concat("*").concat(recvDate);
packetQ.add(msg);
//logger.debug("[UDPDataIn] : " + msg);
} catch (Exception e) {
logger.error("[UDPDataIn] Unknown Exception Occur " + e.getMessage() );
}
}
private void recvDataIn(MsgObjVO vo) {
try {
recvPacketAdd(vo);
} catch (Exception e) {
logger.error(SocketUtil.getStatckTrace(e));
}
}
private void sendDataIn(MsgObjVO vo) {
try {
udpManager.sendMsg(vo.getSendClientIP(), vo.getSendClientPort(), vo);
} catch (Exception e) {
logger.error(SocketUtil.getStatckTrace(e));
}
}
// 설정에따라 REST용 서비스 큐 생성
public void createQueue() {
Class cls ;
for(int idx=0; idx<scvQcount; idx++) {
String className = "java.util.LinkedList";
Queue<ServiceAsdeData> obj = null;
try {
cls = Class.forName(className);
obj = (Queue<ServiceAsdeData>) cls.newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sendQueue.put(idx, obj);
}
}
private void serviceQClear() throws InterruptedException, IOException {
String sRecvTime = "";
ServiceAsdeData jsonData = new ServiceAsdeData();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime dateTime;
int iQcnt = 0;
if(serviceRunnig) return;
try {
for(int idx=0; idx<scvQcount; idx++) {
iQcnt = sendQueue.get(idx).size();
if (iQcnt > scvQmaxCount ) {
jsonData = sendQueue.get(idx).peek();
sRecvTime = jsonData.getRecptn_dt();
dateTime = LocalDateTime.parse(sRecvTime, formatter);
Duration diff = Duration.between(dateTime, LocalDateTime.now());
if( scvQclearTime > 0 && diff.toMillis() > scvQclearTime) { // 일정시간 미사용으로 판단
sendQueue.get(idx).clear();
logger.info("[MainController] serviceQClear : " + (idx +1) +"번 Queue 장기 미사용으로 초기화 (" + iQcnt +"건), 설정시간:" + scvQclearTime);
}
else if( diff.toMillis() > scvQdiffTime) { // 데이터 과적재
iQcnt = sendQueue.get(idx).size();
int iPollCnt = iQcnt - scvQmaxCount;
while (iQcnt - scvQmaxCount >= 0) {
sendQueue.get(idx).poll();
iQcnt--;
}
logger.info("[MainController] serviceQpoll : " + (idx +1) +"번 Queue 일부 버림 (" + iPollCnt +"건), 설정시간:" + scvQdiffTime + " 설정건수:"+ scvQmaxCount);
}
}
}
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.error("[MainController] serviceQClear-InterruptedException : " + AsdeUtil.getStatckTrace(e));
} catch (Exception e) {
logger.error("[MainController] serviceQClear-Exception : " + AsdeUtil.getStatckTrace(e) + ">> " + sRecvTime.toString() );
}
}
@Override
public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
this.stop();
logger.info("====================== SYSTEM STOPED ======================");
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
package kr.gmtc.gw.dev.asderecv.controller;
import kr.gmtc.gw.comp.socket.udp.UDPEventListener;
import kr.gmtc.gw.comp.socket.udp.UDPManager;
import kr.gmtc.gw.comp.socket.utils.SocketUtil;
import kr.gmtc.gw.comp.socket.vo.MsgObjVO;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceAsdeData;
import kr.gmtc.gw.dev.asderecv.asde.utils.AsdeUtil;
import kr.gmtc.gw.dev.asderecv.thread.CustomThread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
//@Component("controller")
public class MainController implements ApplicationListener<ContextClosedEvent> {
@Value("${root}")
private String path;
@Resource(name = "packetQ")
Queue<String> packetQ;
@Resource(name = "sendQueue")
HashMap<Integer, Queue<ServiceAsdeData>> sendQueue;
@Resource(name = "serviceRunnig")
private boolean serviceRunnig = false;
@Value("${asde.service.queueCount}")
private Integer scvQcount;
@Value("${asde.service.clearQ.maxCount}")
private Integer scvQmaxCount;
@Value("${asde.service.clearQ.diffTime}")
private Integer scvQdiffTime;
@Value("${asde.service.clearQ.clearTime}")
private Integer scvQclearTime;
private boolean isRunning;
protected UDPManager udpManager;
private UDPEventListener udpListener;
private ArrayBlockingQueue<MsgObjVO> recvQ;
private ArrayBlockingQueue<MsgObjVO> sendQ;
private Thread recvQThread;
private Thread sendQThread;
private CustomThread serviceQClearThread;
protected Logger logger;
protected MainController(@Value("${root}") String path){
isRunning = false;
logger = LoggerFactory.getLogger(MainController.class);
recvQ = new ArrayBlockingQueue<>(100000);
sendQ = new ArrayBlockingQueue<MsgObjVO>(100000);
udpListener = createUDPEventListener();
udpManager = new UDPManager(path, udpListener);
recvQThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
try {
int cnt = recvQ.size();
if (cnt > 1000) {
cnt = 1000;
}
for (int i = 0; i <= cnt - 1; i++) {
if (recvQ != null) {
MsgObjVO vo = recvQ.poll();
if (vo != null) {
recvDataIn(vo);
vo = null;
}
}
}
Thread.sleep(1);
} catch (InterruptedException e) {
logger.error(SocketUtil.getStatckTrace(e));
}
}
}
});
sendQThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
try {
int cnt = sendQ.size();
if (cnt > 1000) {
cnt = 1000;
}
for (int i = 0; i <= cnt - 1; i++) {
if (sendQ != null) {
MsgObjVO vo = sendQ.poll();
if (vo != null) {
sendDataIn(vo);
vo = null;
}
}
}
Thread.sleep(1);
} catch (InterruptedException e) {
logger.error(SocketUtil.getStatckTrace(e));
}
}
}
});
}
@Order(0)
@EventListener(ApplicationReadyEvent.class)
public void initialize() {
try {
// 전송용 Queue 생성
createQueue();
// 업무 스레드 생성, 대기 없이 무한반복
serviceQClearThread = new CustomThread("serviceQClearThread", this, CustomThread.NO_SLEEP, this::serviceQClear, null, false);
} catch(Exception e){
logger.error("[MainController] Prepare Fail " + AsdeUtil.getStatckTrace(e));
System.exit(1);
}
}
@Order(1)
@EventListener(ApplicationReadyEvent.class)
public void start() {
isRunning = true;
udpManager.initializeUDPFromXML();
udpManager.startClient();
recvQThread.start();
sendQThread.start();
}
public void stop() {
isRunning = false;
}
//////////////////////////////////////////////////////////////////////
protected UDPEventListener createUDPEventListener() {
UDPEventListener listener = new UDPEventListener() {
@Override
public void udpDataIn(MsgObjVO vo) {
// // TODO Auto-generated method stub
// throw new UnsupportedOperationException("Unimplemented method 'udpDataIn'");
//logger.info("RECV-DATA : " + vo.getMsg().toString());
recvPacketAdd(vo);
}
@Override
public void udpSendData(MsgObjVO vo) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'udpSendData'");
}
@Override
public void udpSendData(String ip, int port, MsgObjVO vo) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'udpSendData'");
}
@Override
public void connected(String ip, int port, int statusCode, String description) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'connected'");
}
@Override
public void disconnected(String ip, int port, int statusCode, String description) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'disconnected'");
}
@Override
public void connectionStatus(String ip, int port, String connEvent, int statusCode, String description) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'connectionStatus'");
}
};
return listener;
}
protected void recvPacketAdd(MsgObjVO vo) {
if (vo.getMsg().length < 1) {
return;
}
String recvDate = "";
try {
String msg = SocketUtil.byteArrayToHexString(vo.getMsg());
recvDate = vo.getRecvDT().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
msg = msg.concat("*").concat(recvDate);
packetQ.add(msg);
//logger.debug("[UDPDataIn] : " + msg);
} catch (Exception e) {
logger.error("[UDPDataIn] Unknown Exception Occur " + e.getMessage() );
}
}
private void recvDataIn(MsgObjVO vo) {
try {
recvPacketAdd(vo);
} catch (Exception e) {
logger.error(SocketUtil.getStatckTrace(e));
}
}
private void sendDataIn(MsgObjVO vo) {
try {
udpManager.sendMsg(vo.getSendClientIP(), vo.getSendClientPort(), vo);
} catch (Exception e) {
logger.error(SocketUtil.getStatckTrace(e));
}
}
// 설정에따라 REST용 서비스 큐 생성
public void createQueue() {
Class cls ;
for(int idx=0; idx<scvQcount; idx++) {
String className = "java.util.LinkedList";
Queue<ServiceAsdeData> obj = null;
try {
cls = Class.forName(className);
obj = (Queue<ServiceAsdeData>) cls.newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sendQueue.put(idx, obj);
}
}
private void serviceQClear() throws InterruptedException, IOException {
String sRecvTime = "";
ServiceAsdeData jsonData = new ServiceAsdeData();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime dateTime;
int iQcnt = 0;
if(serviceRunnig) return;
try {
for(int idx=0; idx<scvQcount; idx++) {
iQcnt = sendQueue.get(idx).size();
if (iQcnt > scvQmaxCount ) {
jsonData = sendQueue.get(idx).peek();
sRecvTime = jsonData.getRecptn_dt();
dateTime = LocalDateTime.parse(sRecvTime, formatter);
Duration diff = Duration.between(dateTime, LocalDateTime.now());
if( scvQclearTime > 0 && diff.toMillis() > scvQclearTime) { // 일정시간 미사용으로 판단
sendQueue.get(idx).clear();
logger.info("[MainController] serviceQClear : " + (idx +1) +"번 Queue 장기 미사용으로 초기화 (" + iQcnt +"건), 설정시간:" + scvQclearTime);
}
else if( diff.toMillis() > scvQdiffTime) { // 데이터 과적재
iQcnt = sendQueue.get(idx).size();
int iPollCnt = iQcnt - scvQmaxCount;
while (iQcnt - scvQmaxCount >= 0) {
sendQueue.get(idx).poll();
iQcnt--;
}
logger.info("[MainController] serviceQpoll : " + (idx +1) +"번 Queue 일부 버림 (" + iPollCnt +"건), 설정시간:" + scvQdiffTime + " 설정건수:"+ scvQmaxCount);
}
}
}
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.error("[MainController] serviceQClear-InterruptedException : " + AsdeUtil.getStatckTrace(e));
} catch (Exception e) {
logger.error("[MainController] serviceQClear-Exception : " + AsdeUtil.getStatckTrace(e) + ">> " + sRecvTime.toString() );
}
}
@Override
public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
this.stop();
logger.info("====================== SYSTEM STOPED ======================");
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}

View File

@ -1,112 +1,112 @@
package kr.gmtc.gw.dev.asderecv.thread;
import kr.gmtc.gw.dev.asderecv.thread.handler.CustomThreadOnTerminate;
import kr.gmtc.gw.dev.asderecv.thread.handler.CustomThreadWork;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CustomThread extends Thread{
/* 대기시간 없음 */
public static final long NO_SLEEP = 0;
/* 1밀리 초 */
public static final long SLEEP_MILLI_SEC = 1;
/* 1초 */
public static final long SLEEP_SECOND = 1000;
/* 30초 */
public static final long SLEEP_HALF_MINIUTE = 30000;
/* 1분 */
public static final long SLEEP_MINIUTE = 60000;
public final String controllClassName;
public final long repeatMiliSec;
public final CustomThreadWork definedWork;
public final CustomThreadOnTerminate definedTerminate;
public final Logger logger;
private boolean running;
/**
* .<br>
* {@link Thread#sleep(long)} .<br>
* sleep <br>
* {@link #gracefulStop()}
* @param threadName
* @param controllClass , this
* @param repeatMiliSec Sleep ( ), 0
* @param definedWork
* @param definedTerminate
* @param autoStart
*/
public CustomThread(String threadName, Object controllClass, long repeatMiliSec,
CustomThreadWork definedWork, CustomThreadOnTerminate definedTerminate, boolean autoStart) {
if (definedWork == null) {
throw new IllegalArgumentException("[CustomThread] - definedWork is null.");
}
this.definedWork = definedWork;
this.definedTerminate = definedTerminate;
this.controllClassName = controllClass == null ? "" : controllClass.getClass().getSimpleName();
this.repeatMiliSec = repeatMiliSec > 0 ? repeatMiliSec : 0;
this.logger = LoggerFactory.getLogger(CustomThread.class);
this.running = false;
setName(threadName);
setDaemon(true);
if (autoStart) {
this.start();
}
}
@Override
public void run() {
logger.info("[CustomThread] Started.");
while ( this.running && !this.isInterrupted()) {
try {
try {
this.definedWork.work();
} finally {
if (this.repeatMiliSec > 0) {
Thread.sleep(this.repeatMiliSec);
}
}
} catch(InterruptedException e) { // 인터럽트 수신시 종료
logger.error("[CustomThread] Interrupted. "+ e.toString());
Thread.currentThread().interrupt();
break;
} catch(Exception e) { // 처리되지 않은 예외 로깅, 예외에 의한 무한루프에 주의
logger.error("[CustomThread] Unknown Exception Occur. " + e.toString());
}
}
if(this.definedTerminate != null) {
this.definedTerminate.onTerminate();
}
logger.error("[CustomThread] Stoped.");
}
@Override
public String toString() {
return "CustomThread [controllClass=" + this.controllClassName + ", threadName=" + getName() +
", runnig=" + this.running + ", alive=" + isAlive()+ ", repeatMiliSec=" + this.repeatMiliSec +
", definedTerminate=" + (this.definedTerminate == null ? "no" : "yes") + "]";
}
@Override
public synchronized void start() {
this.running = true;
super.start();
}
/**
* , .
*/
public void gracefulStop() {
this.running = false;
}
}
package kr.gmtc.gw.dev.asderecv.thread;
import kr.gmtc.gw.dev.asderecv.thread.handler.CustomThreadOnTerminate;
import kr.gmtc.gw.dev.asderecv.thread.handler.CustomThreadWork;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CustomThread extends Thread{
/* 대기시간 없음 */
public static final long NO_SLEEP = 0;
/* 1밀리 초 */
public static final long SLEEP_MILLI_SEC = 1;
/* 1초 */
public static final long SLEEP_SECOND = 1000;
/* 30초 */
public static final long SLEEP_HALF_MINIUTE = 30000;
/* 1분 */
public static final long SLEEP_MINIUTE = 60000;
public final String controllClassName;
public final long repeatMiliSec;
public final CustomThreadWork definedWork;
public final CustomThreadOnTerminate definedTerminate;
public final Logger logger;
private boolean running;
/**
* .<br>
* {@link Thread#sleep(long)} .<br>
* sleep <br>
* {@link #gracefulStop()}
* @param threadName
* @param controllClass , this
* @param repeatMiliSec Sleep ( ), 0
* @param definedWork
* @param definedTerminate
* @param autoStart
*/
public CustomThread(String threadName, Object controllClass, long repeatMiliSec,
CustomThreadWork definedWork, CustomThreadOnTerminate definedTerminate, boolean autoStart) {
if (definedWork == null) {
throw new IllegalArgumentException("[CustomThread] - definedWork is null.");
}
this.definedWork = definedWork;
this.definedTerminate = definedTerminate;
this.controllClassName = controllClass == null ? "" : controllClass.getClass().getSimpleName();
this.repeatMiliSec = repeatMiliSec > 0 ? repeatMiliSec : 0;
this.logger = LoggerFactory.getLogger(CustomThread.class);
this.running = false;
setName(threadName);
setDaemon(true);
if (autoStart) {
this.start();
}
}
@Override
public void run() {
logger.info("[CustomThread] Started.");
while ( this.running && !this.isInterrupted()) {
try {
try {
this.definedWork.work();
} finally {
if (this.repeatMiliSec > 0) {
Thread.sleep(this.repeatMiliSec);
}
}
} catch(InterruptedException e) { // 인터럽트 수신시 종료
logger.error("[CustomThread] Interrupted. "+ e.toString());
Thread.currentThread().interrupt();
break;
} catch(Exception e) { // 처리되지 않은 예외 로깅, 예외에 의한 무한루프에 주의
logger.error("[CustomThread] Unknown Exception Occur. " + e.toString());
}
}
if(this.definedTerminate != null) {
this.definedTerminate.onTerminate();
}
logger.error("[CustomThread] Stoped.");
}
@Override
public String toString() {
return "CustomThread [controllClass=" + this.controllClassName + ", threadName=" + getName() +
", runnig=" + this.running + ", alive=" + isAlive()+ ", repeatMiliSec=" + this.repeatMiliSec +
", definedTerminate=" + (this.definedTerminate == null ? "no" : "yes") + "]";
}
@Override
public synchronized void start() {
this.running = true;
super.start();
}
/**
* , .
*/
public void gracefulStop() {
this.running = false;
}
}

View File

@ -1,6 +1,6 @@
package kr.gmtc.gw.dev.asderecv.thread.handler;
@FunctionalInterface
public interface CustomThreadOnTerminate {
public void onTerminate();
}
package kr.gmtc.gw.dev.asderecv.thread.handler;
@FunctionalInterface
public interface CustomThreadOnTerminate {
public void onTerminate();
}

View File

@ -1,6 +1,6 @@
package kr.gmtc.gw.dev.asderecv.thread.handler;
@FunctionalInterface
public interface CustomThreadWork {
public void work() throws Exception;
}
package kr.gmtc.gw.dev.asderecv.thread.handler;
@FunctionalInterface
public interface CustomThreadWork {
public void work() throws Exception;
}

View File

@ -0,0 +1,53 @@
package kr.gmtc.gw.dev.restdev.config;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import kr.gmtc.gw.dev.asderecv.asde.rest.vo.ServiceAsdeData;
//@Configuration("restConfig")
public class RestConfig {
@Value("${root}")
private String root;
@Value("${request.url.recvTest}")
private String testReqTestUrl = "http://localhost:18080/test";
@PostConstruct
private void initialize() {
}
@Bean(name = "serviceRunnig")
public boolean serviceRunnig(){
return false;
}
@Bean(name = "packetQ")
public Queue<String> packetQ(){
return new LinkedBlockingQueue<String>();
}
@Bean(name = "sendQueue")
public HashMap<Integer, Queue<ServiceAsdeData>> sendQueue(){
return new LinkedHashMap<Integer, Queue<ServiceAsdeData>>();
}
}

View File

@ -0,0 +1,160 @@
package kr.gmtc.gw.dev.restdev.controller;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.ObjectMapper;
import kr.gmtc.gw.dev.restdev.service.StandMasterService;
import kr.gmtc.gw.dev.restdev.vo.AImetaTestVO;
import kr.gmtc.gw.dev.restdev.vo.AImetaTestVO.Data;
import kr.gmtc.gw.dev.restdev.vo.AiMetaVideoStatusVO;
import kr.gmtc.gw.dev.restdev.vo.AiMetaVideoStatusVO.AiMetaVideoStatusVO_Data;
import kr.gmtc.gw.dev.restdev.vo.AiMetaVideoStatusVO.AiMetaVideoStatusVO_Sts;
import kr.gmtc.gw.dev.restdev.vo.StandMasterVO;
@Component("restReciveController")
public class RestReciveController {
private final RestTemplate restTemplate;
private final ObjectMapper objectMapper;
private Queue<AImetaTestVO> recvQ;
private AiMetaVideoStatusVO mapStatus;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
@Autowired
private StandMasterService standService;
public RestReciveController() {
this.restTemplate = new RestTemplate();
this.objectMapper = new ObjectMapper();
this.recvQ = new LinkedBlockingQueue<AImetaTestVO>();
this.mapStatus = new AiMetaVideoStatusVO();
}
@Scheduled(fixedRate = 1000) // 1초마다 실행
public void requestJsonData() {
// JSON 데이터를 요청할 URL 설정
String apiUrl = "http://localhost";
String sPort = "18082";
String sReqMsg = "getVideoTest";
String sReqUrl = apiUrl + ":" +sPort + "/" + sReqMsg;
// 요청을 보내고 JSON 데이터를 받아옴
String jsonResponse = restTemplate.getForObject(sReqUrl, String.class);
// 받아온 JSON 데이터를 Message 객체로 변환
try {
AImetaTestVO message = objectMapper.readValue(jsonResponse, AImetaTestVO.class);
recvQ.offer(message);
// 변환된 Message 객체를 원하는 방식으로 처리
System.out.println("Received Message: " + message.toString());
} catch (Exception e) {
// JSON 파싱 오류 처리
e.printStackTrace();
}
splitData();
}
private void splitData(){
for(AImetaTestVO oneData : recvQ ){
List<Data> recvDatas = oneData.getData();
int iDataCnt = recvDatas.size();
for(int idx=0; idx<iDataCnt; idx++ ){
List<String> listCctvs = recvDatas.get(idx).getCc_id();
int iCctvCnt = listCctvs.size();
for(int idxC=0; idxC<iCctvCnt; idxC++){
// cctv_id <-> 주기장 번호 매핑
// MetaAIVideoStatus3 mapStatus3 = new MetaAIVideoStatus3();
String sCctvID = listCctvs.get(idxC);
String sStandNO = mappingStand(sCctvID);
String sSts = recvDatas.get(idx).getStts_cls();
AiMetaVideoStatusVO_Sts stsMap = mapStatus.getStsMap(sStandNO);
AiMetaVideoStatusVO_Data dataMap = mapStatus.getStsMap(sStandNO).getDataMap(sSts);
Map<String, AiMetaVideoStatusVO_Sts> standStsMap = new HashMap<String, AiMetaVideoStatusVO_Sts>();
Date now = new Date();
dataMap.setRecvTime( String.valueOf(sdf.format(now)));
dataMap.setStandNo(sStandNO);
dataMap.setSts(sSts);
standStsMap.put(sStandNO, stsMap);
mapStatus.setMapStandNoGroup(standStsMap);
}
}
}
}
private String mappingStand(String sCctvID){
String sRetStandNo = "";
List<StandMasterVO> standList = standService.getStandList();
for(StandMasterVO standMaster : standList){
if(standMaster.getCctvID().equals(sCctvID)){
sRetStandNo = standMaster.getStandNO();
return sRetStandNo;
}
}
return sRetStandNo;
}
// private boolean checkExistMap(String sKey){
// boolean isEx = false;
// if(mapStatus.get(sKey) != null){
// isEx = true;
// }
// return isEx;
// }
}

View File

@ -0,0 +1,83 @@
package kr.gmtc.gw.dev.restdev.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import kr.gmtc.gw.dev.restdev.vo.AImetaTestVO;
import kr.gmtc.gw.dev.restdev.vo.AImetaTestVO.Data;
import kr.gmtc.gw.dev.restdev.vo.AImetaTestVO.Header;
@RestController
public class RestReqeustController {
@RequestMapping(value={"getTest/{param1}/{param2}"}, method=RequestMethod.GET)
public String getTest(@PathVariable String param1, @PathVariable String param2){
String sParam1, sParam2;
sParam1 = param1;
sParam2 = param2;
return "return :" + sParam1 + "/" + sParam2;
}
@RequestMapping(value={"getVideoTest"}, method=RequestMethod.GET)
public AImetaTestVO getMessage() {
// JSON 형식의 메시지를 생성
Header header = new Header("200", "OK");
List<Data> dataList = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 2; i++) { // 두 개의 데이터 생성
String on_arcrft = random.nextBoolean() ? "true" : "false";
String stts_cls = getRandomStatusClass(random);
String arcrft_tp = "A380-800";
String zn_id = String.valueOf(106 + i);
List<String> bb_tlp = Arrays.asList("241", "489");
List<String> crd_frm = Arrays.asList("286", "500");
List<String> cc_id = Arrays.asList(String.valueOf(random.nextInt(4) + 102), String.valueOf(random.nextInt(4) + 102)); // 102부터 105까지의 랜덤값
List<String> crd_glb = Arrays.asList("37.344556", "127.422913");
List<String> bb_brp = Arrays.asList("331", "512");
String dtct_tm = "";
String arln = "KOR-001";
String trck_id = "";
Data data = new Data();
data.setOn_arcrft(on_arcrft);
data.setStts_cls(stts_cls);
data.setArcrft_tp(arcrft_tp);
data.setZn_id(zn_id);
data.setBb_brp(bb_brp);
data.setBb_tlp(bb_tlp);
data.setCrd_frm(crd_frm);
data.setCc_id(cc_id);
data.setCrd_glb(crd_glb);
data.setDtct_tm(dtct_tm);
data.setArln(arln);
data.setTrck_id(trck_id);
dataList.add(data);
}
return new AImetaTestVO(header, dataList);
}
private String getRandomStatusClass(Random random) {
String[] statusClasses = {"brdg_cnnctd", "crg_dr_opnd", "twng_cr_cnnctd"};
int randomIndex = random.nextInt(statusClasses.length);
return statusClasses[randomIndex];
}
}

View File

@ -0,0 +1,40 @@
package kr.gmtc.gw.dev.restdev.service;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Service;
import kr.gmtc.gw.dev.restdev.vo.StandMasterVO;
@Service("standMasterService")
public class StandMasterService {
private List<StandMasterVO> standList;
public StandMasterService(){
standList = new ArrayList<StandMasterVO>();
standList.add(new StandMasterVO("G101", "101"));
standList.add(new StandMasterVO("G102", "102"));
standList.add(new StandMasterVO("G103", "103"));
standList.add(new StandMasterVO("G104", "104"));
standList.add(new StandMasterVO("G105", "105"));
standList.add(new StandMasterVO("G106", "106"));
standList.add(new StandMasterVO("G107", "107"));
standList.add(new StandMasterVO("G108", "108"));
standList.add(new StandMasterVO("G109", "109"));
}
public List<StandMasterVO> getStandList(){
return this.standList;
}
}

View File

@ -0,0 +1,178 @@
package kr.gmtc.gw.dev.restdev.vo;
import java.util.List;
public class AImetaTestVO {
private Header header;
private List<Data> data;
public AImetaTestVO() {
}
public AImetaTestVO(Header header, List<Data> data){
this.header = header;
this.data = data;
}
public Header getHeader() {
return header;
}
public void setHeader(Header header) {
this.header = header;
}
public List<Data> getData() {
return data;
}
public void setData(List<Data> data) {
this.data = data;
}
public static class Header {
private String result_code;
private String result_msg;
public Header() {
}
public Header(String result_code, String result_msg) {
this.result_code = result_code;
this.result_msg = result_msg;
}
public String getResult_code() {
return result_code;
}
public void setResult_code(String result_code) {
this.result_code = result_code;
}
public String getResult_msg() {
return result_msg;
}
public void setResult_msg(String result_msg) {
this.result_msg = result_msg;
}
}
public static class Data {
private String on_arcrft;
private String stts_cls;
private String arcrft_tp;
private String zn_id;
private List<String> bb_tlp;
private List<String> crd_frm;
private List<String> cc_id;
private List<String> crd_glb;
private List<String> bb_brp;
private String dtct_tm;
private String arln;
private String trck_id;
public String getOn_arcrft() {
return on_arcrft;
}
public void setOn_arcrft(String on_arcrft) {
this.on_arcrft = on_arcrft;
}
public String getStts_cls() {
return stts_cls;
}
public void setStts_cls(String stts_cls) {
this.stts_cls = stts_cls;
}
public String getArcrft_tp() {
return arcrft_tp;
}
public void setArcrft_tp(String arcrft_tp) {
this.arcrft_tp = arcrft_tp;
}
public String getZn_id() {
return zn_id;
}
public void setZn_id(String zn_id) {
this.zn_id = zn_id;
}
public List<String> getBb_tlp() {
return bb_tlp;
}
public void setBb_tlp(List<String> bb_tlp) {
this.bb_tlp = bb_tlp;
}
public List<String> getCrd_frm() {
return crd_frm;
}
public void setCrd_frm(List<String> crd_frm) {
this.crd_frm = crd_frm;
}
public List<String> getCc_id() {
return cc_id;
}
public void setCc_id(List<String> cc_id) {
this.cc_id = cc_id;
}
public List<String> getCrd_glb() {
return crd_glb;
}
public void setCrd_glb(List<String> crd_glb) {
this.crd_glb = crd_glb;
}
public List<String> getBb_brp() {
return bb_brp;
}
public void setBb_brp(List<String> bb_brp) {
this.bb_brp = bb_brp;
}
public String getDtct_tm() {
return dtct_tm;
}
public void setDtct_tm(String dtct_tm) {
this.dtct_tm = dtct_tm;
}
public String getArln() {
return arln;
}
public void setArln(String arln) {
this.arln = arln;
}
public String getTrck_id() {
return trck_id;
}
public void setTrck_id(String trck_id) {
this.trck_id = trck_id;
}
}
}

View File

@ -0,0 +1,56 @@
package kr.gmtc.gw.dev.restdev.vo;
import java.util.HashMap;
import java.util.Map;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AiMetaVideoStatusVO {
private Map<String, AiMetaVideoStatusVO_Sts> mapStandNoGroup;
public AiMetaVideoStatusVO(){
mapStandNoGroup = new HashMap<String, AiMetaVideoStatusVO_Sts>();
}
public AiMetaVideoStatusVO_Sts getStsMap(String sStandNo){
return mapStandNoGroup.get(sStandNo);
}
@Getter
@Setter
public static class AiMetaVideoStatusVO_Sts {
private Map<String, AiMetaVideoStatusVO_Data> mapStatusGroup;
public AiMetaVideoStatusVO_Sts(String sSts, AiMetaVideoStatusVO_Data map){
mapStatusGroup = new HashMap<String, AiMetaVideoStatusVO_Data>();
}
public AiMetaVideoStatusVO_Data getDataMap(String sSts){
return mapStatusGroup.get(sSts);
}
}
@Getter
@Setter
public static class AiMetaVideoStatusVO_Data {
private String standNo;
private String sts;
private String cctvID;
private String recvTime;
}
}

View File

@ -0,0 +1,35 @@
package kr.gmtc.gw.dev.restdev.vo;
public class StandMasterVO {
private String standNO;
private String cctvID;
public StandMasterVO(String standNO, String cctvID){
this.standNO = standNO;
this.cctvID = cctvID;
}
public String getStandNO() {
return standNO;
}
public void setStandNO(String standNo) {
this.standNO = standNo;
}
public String getCctvID() {
return cctvID;
}
public void setCctvID(String cctvID) {
this.cctvID = cctvID;
}
}

View File

@ -41,3 +41,7 @@ spring:
root: D:\Workspace\Odroid_repository\EyeGW_CompDev
request:
url:
recvTest: http://localhost:18082/getVideoTest

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<AsterixListCategory>
<AsterixSpecFile category="10" file="spec/alterixCat010Indra.yml" />
<AsterixSpecFile category="11" file="spec/alterixCat011.yml" />
</AsterixListCategory>
<?xml version="1.0" encoding="UTF-8"?>
<AsterixListCategory>
<AsterixSpecFile category="10" file="spec/alterixCat010Indra.yml" />
<AsterixSpecFile category="11" file="spec/alterixCat011.yml" />
</AsterixListCategory>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff