Browse Source

update traaceConfig

HANTE 1 tháng trước cách đây
mục cha
commit
fc5419a865

+ 6 - 6
src/main/java/com/tsi/comm/server/config/TraceConfig.java

@@ -24,8 +24,9 @@ public class TraceConfig {
 
     private final TsiNodeManager nodeManager;
 
-    private boolean queueReport = true;
-    private boolean sessionReport = true;
+    private boolean queueReport = false;
+    private boolean sessionReport = false;
+    private boolean nodeLogging = false;
 
     private Properties getProperties() {
         String workingDir = System.getProperty("user.dir");
@@ -75,11 +76,10 @@ public class TraceConfig {
                     }
                 });
             }
-            String queue  = props.getProperty("queue-report",  "true").trim();
-            this.queueReport = queue.equalsIgnoreCase("true");
 
-            String session  = props.getProperty("session-report",  "true").trim();
-            this.sessionReport = session.equalsIgnoreCase("true");
+            this.sessionReport = props.getProperty("session-report",  "false").trim().equalsIgnoreCase("true");
+            this.queueReport = props.getProperty("queue-report",  "false").trim().equalsIgnoreCase("true");
+            this.nodeLogging = props.getProperty("node-logging",  "false").trim().equalsIgnoreCase("true");
         }
         catch(Exception e) {
             log.error("{}.loadDebugInfo: Exception2: {}", this.getClass().getSimpleName(), e.toString());

+ 4 - 4
src/main/java/com/tsi/comm/server/process/dbms/TsiCvimDbmsProcess.java

@@ -23,13 +23,13 @@ public class TsiCvimDbmsProcess extends AbstractTsiCvimProcess {
     private final TsiCvimServerConfig config;
     private final TsiNodeManager nodeManager;
     private ExecutorService executor = null;
-
+    private int qSize;
     public void start() {
         final ThreadGroup workerGroup = new ThreadGroup("dbmsProcess");
         this.workers = this.config.getDbmsWorkers();
-        int qSize = this.nodeManager.size();
+        this.qSize = this.nodeManager.size();
         if (this.workers == 1) {
-            qSize *= 2;
+            this.qSize *= 2;
         }
 
         this.executor = Executors.newFixedThreadPool(this.workers, new ThreadFactory() {
@@ -43,7 +43,7 @@ public class TsiCvimDbmsProcess extends AbstractTsiCvimProcess {
         });
 
         for (int ii = 0; ii < this.workers; ii++) {
-            TsiCvimDbmsWorker dbmsWorker = new TsiCvimDbmsWorker(ii, qSize);
+            TsiCvimDbmsWorker dbmsWorker = new TsiCvimDbmsWorker(ii, this.qSize);
             this.workerList.add(dbmsWorker);
             this.executor.submit(dbmsWorker); // 여기서 실행됨!
         }

+ 5 - 9
src/main/java/com/tsi/comm/server/process/logging/TsiCvimLoggingProcess.java

@@ -23,23 +23,19 @@ import java.util.concurrent.TimeUnit;
 @Service
 public class TsiCvimLoggingProcess extends AbstractTsiCvimProcess {
 
-//    private List<TsiCvimLoggingWorker> workerList = new ArrayList<TsiCvimLoggingWorker>();
     private final TsiNodeManager nodeManager;
+
     private ExecutorService executor = null;
+    private int qSize;
 
     public void start() {
         ThreadGroup workerGroup = new ThreadGroup("loggingProcess");
         TsiCvimServerConfig tsiCvimServerConfig = (TsiCvimServerConfig) AppUtils.getBean(TsiCvimServerConfig.class);
 
         this.workers = tsiCvimServerConfig.getLoggingWorkers();
-        if (this.workers <= 0) this.workers = 1;
-        int nodes = this.nodeManager.size();
-        int qSize = nodes;
-        if (nodes > qSize) {
-            qSize = nodes;
-        }
+        this.qSize = this.nodeManager.size();
         if (this.workers == 1) {
-            qSize *= 2;
+            this.qSize *= 2;
         }
 
         this.executor = Executors.newFixedThreadPool(this.workers, new ThreadFactory() {
@@ -53,7 +49,7 @@ public class TsiCvimLoggingProcess extends AbstractTsiCvimProcess {
         });
 
         for (int ii = 0; ii < this.workers; ii++) {
-            TsiCvimLoggingWorker loggingWorker = new TsiCvimLoggingWorker(ii, qSize);
+            TsiCvimLoggingWorker loggingWorker = new TsiCvimLoggingWorker(ii, this.qSize);
             this.workerList.add(loggingWorker);
             this.executor.submit(loggingWorker); // 여기서 실행됨!
         }

+ 1 - 0
src/main/java/com/tsi/comm/server/process/logging/TsiCvimLoggingWorker.java

@@ -1,6 +1,7 @@
 package com.tsi.comm.server.process.logging;
 
 import com.tsi.app.common.utils.TimeUtils;
+import com.tsi.comm.server.config.TraceConfig;
 import com.tsi.comm.server.process.AbstractTsiCvimWorker;
 import com.tsi.comm.server.protocol.AbstractTsiPacket;
 import lombok.Getter;

+ 4 - 5
src/main/java/com/tsi/comm/server/process/packet/TsiCvimPacketProcess.java

@@ -27,17 +27,16 @@ public class TsiCvimPacketProcess extends AbstractTsiCvimProcess {
     private final KafkaProducerService kafkaProducerService;
     private final TsiNodeManager nodeManager;
     private ExecutorService executor = null;
+    private int qSize;
 
     public void start() {
         ThreadGroup workerGroup = new ThreadGroup("packetProcess");
         TsiCvimServerConfig tsiCvimServerConfig = (TsiCvimServerConfig) AppUtils.getBean(TsiCvimServerConfig.class);
 
         this.workers = tsiCvimServerConfig.getPacketWorkers();
-        if (this.workers <= 0) this.workers = 1;
-        int nodes = this.nodeManager.size();
-        int qSize = nodes;
+        this.qSize = this.nodeManager.size();
         if (this.workers == 1) {
-            qSize *= 3;
+            this.qSize *= 3;
         }
 
         this.executor = Executors.newFixedThreadPool(this.workers, new ThreadFactory() {
@@ -51,7 +50,7 @@ public class TsiCvimPacketProcess extends AbstractTsiCvimProcess {
         });
 
         for (int ii = 0; ii < this.workers; ii++) {
-            TsiCvimPacketWorker packetWorker = new TsiCvimPacketWorker(ii, qSize, this.kafkaProducerService);
+            TsiCvimPacketWorker packetWorker = new TsiCvimPacketWorker(ii, this.qSize, this.kafkaProducerService);
             this.workerList.add(packetWorker);
             this.executor.submit(packetWorker); // 여기서 실행됨!
         }

+ 108 - 73
src/main/java/com/tsi/comm/server/process/packet/TsiCvimPacketWorker.java

@@ -2,7 +2,9 @@ package com.tsi.comm.server.process.packet;
 
 import com.tsi.app.common.app.AppUtils;
 import com.tsi.app.common.cpu.enums.eOpCode;
+import com.tsi.app.common.utils.HexString;
 import com.tsi.app.common.utils.TimeUtils;
+import com.tsi.comm.server.config.TraceConfig;
 import com.tsi.comm.server.config.TsiCvimServerConfig;
 import com.tsi.comm.server.kafka.KafkaProducerService;
 import com.tsi.comm.server.process.AbstractTsiCvimWorker;
@@ -24,9 +26,11 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
 
     //private ConcurrentLinkedQueue<AbstractTsiPacket> DATA_QUEUE;
     private final LinkedBlockingQueue<AbstractTsiPacket> DATA_QUEUE;
+
     private final KafkaProducerService kafkaProducer;
     private final TsiCvimLoggingProcess loggingService;
-    private TsiCvimServerConfig cvimServerConfig;
+    private final TraceConfig traceConfig;
+    private final TsiCvimServerConfig cvimServerConfig;
 
     public TsiCvimPacketWorker(int idx, int qSize, KafkaProducerService kafkaProducer) {
         this.idx = idx;
@@ -34,6 +38,7 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
         this.kafkaProducer = kafkaProducer;
         this.DATA_QUEUE = new LinkedBlockingQueue<>(qSize);
         this.loggingService = (TsiCvimLoggingProcess) AppUtils.getBean(TsiCvimLoggingProcess.class);
+        this.traceConfig = (TraceConfig) AppUtils.getBean(TraceConfig.class);
         this.cvimServerConfig = (TsiCvimServerConfig) AppUtils.getBean(TsiCvimServerConfig.class);
     }
 
@@ -56,7 +61,7 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
                     break;
                 } catch (Exception e) {
                     if (packet != null) {
-                        TsiCpuPacket cpuPacket = (TsiCpuPacket)((AbstractTsiPacket)packet);
+                        TsiCpuPacket cpuPacket = (TsiCpuPacket) packet;
                         TsiNodeVo nodeVo = (TsiNodeVo)cpuPacket.getObj();
                         if (nodeVo != null) {
                             log.warn("PacketWorker({}): {} Node: {}, Network Conn: {}", this.idx, Thread.currentThread().getName(), nodeVo.getKey(), nodeVo.isConnect());
@@ -115,11 +120,13 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
                         this.idx, packet.getNodeId(),
                         this.DATA_QUEUE.size(), this.qSize, this.DATA_QUEUE.remainingCapacity(),
                         TimeUtils.elapsedTime(packet.getRcv()), Thread.currentThread().getName());
+                MDC.remove(Long.toString(packet.getNodeId()));
                 MDC.clear();
             }
         } catch (Exception e) {
             MDC.put("id", Long.toString(packet.getNodeId()));
             log.error("PacketWorker({}): Queue.offer: Exception: {}, {}, {}", this.idx, packet.getNodeId(), Thread.currentThread().getName(), e.getMessage());
+            MDC.remove(Long.toString(packet.getNodeId()));
             MDC.clear();
         }
         return offer;
@@ -129,6 +136,7 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
         AbstractTsiPacket packet = (AbstractTsiPacket)object;
         TsiCpuPacket cpuPacket = (TsiCpuPacket)packet;
         TsiNodeVo nodeVo = (TsiNodeVo)cpuPacket.getObj();//TsiNodeManager.getInstance().get(packet.getNodeId());
+
         long nodeId = packet.getNodeId();
         if (nodeVo == null) {
             // 노드 정보가 없는 경우
@@ -136,96 +144,123 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
             return;
         }
 
+        boolean isLogging = this.traceConfig.isNodeLogging() || nodeVo.isDump();
+        String logKey = nodeVo.getKey();
         int loggingIdx = nodeVo.getIdx();
 
-        long curr = System.nanoTime();
-        if (TimeUnit.MILLISECONDS.convert(curr - packet.getRcv(), TimeUnit.NANOSECONDS) > 3000) {
-            log.error("Packet skip::: {}, {} ms.", nodeId, TimeUnit.MILLISECONDS.convert(curr - packet.getRcv(), TimeUnit.NANOSECONDS));
-            return;
-        }
-        packet.setPop(curr);
+        MDC.put("id", logKey);
+        try {
+            long curr = System.nanoTime();
+            if (TimeUnit.MILLISECONDS.convert(curr - packet.getRcv(), TimeUnit.NANOSECONDS) > 3000) {
+                log.error("Packet skip::: {}, {} ms.", nodeId, TimeUnit.MILLISECONDS.convert(curr - packet.getRcv(), TimeUnit.NANOSECONDS));
+                return;
+            }
+            packet.setPop(curr);
 
-        if (packet.getOpCode() == (byte) eOpCode.TSI_CPU_DISCONNECTED.getValue()) {
-            MDC.put("id", nodeVo.getKey());
-            try {
-                TsiCpuDisconnected disconnected = (TsiCpuDisconnected) packet;
-                disconnected.parsing(nodeVo);
-                if (nodeVo.isSendCvim() && disconnected.getCvimData() != null) {
-                    this.kafkaProducer.sendCvim(disconnected.getNodeId(), disconnected.getCvimData());
-                }
+            if (packet.getOpCode() == (byte) eOpCode.TSI_CPU_DISCONNECTED.getValue()) {
+                try {
+                    TsiCpuDisconnected disconnected = (TsiCpuDisconnected) packet;
+                    disconnected.parsing(nodeVo);
+                    if (nodeVo.isSendCvim() && disconnected.getCvimData() != null) {
+                        this.kafkaProducer.sendCvim(disconnected.getNodeId(), disconnected.getCvimData());
+                    }
 
-                if (disconnected.getAddNodes() != null) {
-                    // 연등지 인 경우
-                    for (int ii = 0; ii < disconnected.getAddNodes().size(); ii++) {
-                        this.kafkaProducer.sendCvim(disconnected.getAddNodes().get(ii).getNodeId(), disconnected.getAddNodes().get(ii).getCvimData());
+                    if (disconnected.getAddNodes() != null) {
+                        // 연등지 인 경우
+                        for (int ii = 0; ii < disconnected.getAddNodes().size(); ii++) {
+                            this.kafkaProducer.sendCvim(disconnected.getAddNodes().get(ii).getNodeId(), disconnected.getAddNodes().get(ii).getCvimData());
+                        }
                     }
+                    if (isLogging) {
+                        this.loggingService.add(packet, loggingIdx);//(int)Thread.currentThread().getId());
+                    }
+                } catch (Exception e) {
+                    log.error("Disconnect Packet parsing error: {}, {}, {}", nodeId, Thread.currentThread().getName(), e.getMessage());
                 }
-                this.loggingService.add(packet, loggingIdx);//(int)Thread.currentThread().getId());
-            } catch (Exception e) {
-                log.error("Disconnect Packet parsing error: {}, {}, {}", nodeId, Thread.currentThread().getName(), e.getMessage());
+                return;
             }
-            MDC.clear();
-            return;
-        }
 
-        // 메모리에서 객체를 찾은 후 패킷 파싱
-        // 20250425: packet parsing 의 로그를 노드별 로그파일에 저장되도록 MDC 위치 변경
-        // 20250425: parsing 함수에 packet-check 여부를 같이 넘겨줘서 CRC 체크여부 확인
-        MDC.put("id", nodeVo.getKey());
-        try {
-            if (!cpuPacket.parsing(nodeVo, this.cvimServerConfig.isCheckPacket())) {
-                // MDC.put("id", nodeVo.getKey());
-                log.error("Packet parsing failed: {}", nodeId);
-                // MDC.clear();
+            // 메모리에서 객체를 찾은 후 패킷 파싱
+            // 20250425: packet parsing 의 로그를 노드별 로그파일에 저장되도록 MDC 위치 변경
+            // 20250425: parsing 함수에 packet-check 여부를 같이 넘겨줘서 CRC 체크여부 확인
+            try {
+                int result = cpuPacket.parsing(nodeVo, this.cvimServerConfig.isCheckPacket());
+                if (0 != result) {
+                    byte[] buf = cpuPacket.getBuf();
+                    int reqLength = TsiCpuPacket.SIZE_PACKET_DATA + (TsiCpuPacket.SIZE_STATUS_DATA * cpuPacket.getCount());
+                    log.error("Node: {}, Packet parsing failed.", nodeId);
+                    log.error("{}", HexString.fromBytes(buf));
+                    switch (result) {
+                        case -1:
+                            log.info("Node: {}, STX Error: {}, {}", nodeId, buf[TsiCpuPacket.INDEX_STX1], buf[TsiCpuPacket.INDEX_STX2]);
+                            break;
+                        case -2:
+                            log.info("Node: {}, Length Error: {}, Version: {}, status count: {}, {}", nodeId, cpuPacket.getLength(), buf[TsiCpuPacket.INDEX_VERSION],
+                                    cpuPacket.getCount(), reqLength);
+                            break;
+                        case -3:
+                            log.error("Node: {}, Check Sum Error: Version: {}, recv: {}, calc: {}", nodeId, buf[TsiCpuPacket.INDEX_VERSION], cpuPacket.getCheckSum(),
+                                    cpuPacket.getCalcCheckSum());
+                            break;
+                        default:
+                            log.error("Node: {}, Packet parsing error: {}", nodeId, result);
+                            break;
+                    }
+                }
+            } catch (Exception e) {
+                log.error("Cpu Packet parsing error: {}, {}, {}", nodeId, Thread.currentThread().getName(), e.getMessage());
             }
-        }
-        catch (Exception e) {
-            log.error("Cpu Packet parsing error: {}, {}, {}", nodeId, Thread.currentThread().getName(), e.getMessage());
-        }
-        MDC.clear();
 
-        packet.setPar(System.nanoTime());
+            packet.setPar(System.nanoTime());
 
-        // 카프카 전송
-        if (nodeVo.isSendNode() && packet.getNodeData() != null) {
-            this.kafkaProducer.sendNode(Long.toString(nodeId), packet.getNodeData());
-        }
-        if (nodeVo.isSendTest()) {
-            this.kafkaProducer.sendTest(nodeId, packet.getTestData());
-        }
-        if (nodeVo.isSendCvim() && packet.getCvimData() != null) {
-            this.kafkaProducer.sendCvim(nodeId, packet.getCvimData());
-        }
+            // 카프카 전송
+            if (nodeVo.isSendNode() && packet.getNodeData() != null) {
+                this.kafkaProducer.sendNode(Long.toString(nodeId), packet.getNodeData());
+            }
+            if (nodeVo.isSendTest()) {
+                this.kafkaProducer.sendTest(nodeId, packet.getTestData());
+            }
+            if (nodeVo.isSendCvim() && packet.getCvimData() != null) {
+                this.kafkaProducer.sendCvim(nodeId, packet.getCvimData());
+            }
 
-        if (cpuPacket.getAddNodes() != null) {
-            // 연등지 인 경우
-            for (int ii = 0; ii < cpuPacket.getAddNodes().size(); ii++) {
-                if (nodeVo.isSendNode()) {
-                    this.kafkaProducer.sendNode(Long.toString(cpuPacket.getAddNodes().get(ii).getNodeId()), cpuPacket.getAddNodes().get(ii).getNodeData());
-                }
-                if (nodeVo.isSendCvim()) {
-                    this.kafkaProducer.sendCvim(cpuPacket.getAddNodes().get(ii).getNodeId(), cpuPacket.getAddNodes().get(ii).getCvimData());
+            if (cpuPacket.getAddNodes() != null) {
+                // 연등지 인 경우
+                for (int ii = 0; ii < cpuPacket.getAddNodes().size(); ii++) {
+                    if (nodeVo.isSendNode()) {
+                        this.kafkaProducer.sendNode(Long.toString(cpuPacket.getAddNodes().get(ii).getNodeId()), cpuPacket.getAddNodes().get(ii).getNodeData());
+                    }
+                    if (nodeVo.isSendCvim()) {
+                        this.kafkaProducer.sendCvim(cpuPacket.getAddNodes().get(ii).getNodeId(), cpuPacket.getAddNodes().get(ii).getCvimData());
+                    }
                 }
             }
-        }
 
-        packet.setEnd(System.nanoTime());
+            packet.setEnd(System.nanoTime());
 
-        packet.setAvg(calcProcessTime(packet.getRcv()));
+            packet.setAvg(calcProcessTime(packet.getRcv()));
 
-        // 로그큐로 전송한다.
-        this.loggingService.add(packet, loggingIdx);//(int)Thread.currentThread().getId());
+            // 로그큐로 전송한다.
+            if (isLogging) {
+                this.loggingService.add(packet, loggingIdx);//(int)Thread.currentThread().getId());
+            }
 
-        // 연등지 인 경우
-        if (cpuPacket.getAddNodes() != null) {
-            for (int ii = 0; ii < cpuPacket.getAddNodes().size(); ii++) {
-                cpuPacket.getAddNodes().get(ii).setAdd(packet.getAdd());
-                cpuPacket.getAddNodes().get(ii).setPop(packet.getPop());
-                cpuPacket.getAddNodes().get(ii).setPar(packet.getPar());
-                cpuPacket.getAddNodes().get(ii).setEnd(packet.getEnd());
-                cpuPacket.getAddNodes().get(ii).setAvg(packet.getAvg());
-                this.loggingService.add(cpuPacket.getAddNodes().get(ii), loggingIdx);
+            // 연등지 인 경우
+            if (cpuPacket.getAddNodes() != null) {
+                for (int ii = 0; ii < cpuPacket.getAddNodes().size(); ii++) {
+                    cpuPacket.getAddNodes().get(ii).setAdd(packet.getAdd());
+                    cpuPacket.getAddNodes().get(ii).setPop(packet.getPop());
+                    cpuPacket.getAddNodes().get(ii).setPar(packet.getPar());
+                    cpuPacket.getAddNodes().get(ii).setEnd(packet.getEnd());
+                    cpuPacket.getAddNodes().get(ii).setAvg(packet.getAvg());
+                    if (isLogging) {
+                        this.loggingService.add(cpuPacket.getAddNodes().get(ii), loggingIdx);
+                    }
+                }
             }
+        } finally {
+            MDC.remove(logKey);
+            MDC.clear();
         }
 
     }

+ 22 - 21
src/main/java/com/tsi/comm/server/protocol/TsiCpuPacket.java

@@ -10,7 +10,6 @@ import com.tsi.app.common.cpu.enums.eOpCode;
 import com.tsi.app.common.cpu.enums.eTimeReliability;
 import com.tsi.app.common.utils.ByteUtils;
 import com.tsi.app.common.utils.CRC16Utils;
-import com.tsi.app.common.utils.HexString;
 import com.tsi.app.common.xnet.NettyUtils;
 import com.tsi.comm.server.mongo.dto.TcsNodeStatus;
 import com.tsi.comm.server.repository.TsiNodeAddManager;
@@ -161,6 +160,7 @@ public class TsiCpuPacket extends AbstractTsiPacket {
     protected List<TsiCpuAddPacket> addNodes;
 
     private final TsiNodeAddManager nodeAddManager;
+    private int  calcCheckSum;
     public TsiCpuPacket(long nodeId, long msec, long nsec, Channel channel) {
         super(nodeId, msec, nsec, NettyUtils.getRemoteIpAddressToLong(channel), NettyUtils.getRemotePort(channel));
         setOpCode(eOpCode.TSI_CPU_SIGNAL_NOTIFY.getValue());
@@ -255,13 +255,13 @@ public class TsiCpuPacket extends AbstractTsiPacket {
         // 체크섬 계산하지 않음
     }
 
-    protected boolean checkPacket() {
+    protected int checkPacket() {
 
         // 0 단계. STX1, STX2 체크
         if (this.buf[INDEX_STX1] != STX1 || this.buf[INDEX_STX2] != STX2) {
-            log.info("Node: {}, STX Error: {}, {}", nodeId, this.buf[INDEX_STX1], this.buf[INDEX_STX2]);
-            log.error("{}", HexString.fromBytes(this.buf));
-            return false;
+//            log.info("Node: {}, STX Error: {}, {}", nodeId, this.buf[INDEX_STX1], this.buf[INDEX_STX2]);
+//            log.error("{}", HexString.fromBytes(this.buf));
+            return -1;
         }
 
         // 1 단계. 패킷 길이 체크
@@ -278,23 +278,23 @@ public class TsiCpuPacket extends AbstractTsiPacket {
 //        }
         int reqLength = SIZE_PACKET_DATA + (SIZE_STATUS_DATA * this.count);
         if (this.length < reqLength ) {
-            log.info("Node: {}, Length Error: {}, Version: {}, status count: {}, {}", nodeId, this.length, this.buf[INDEX_VERSION],
-                    this.count, reqLength);
-            log.error("{}", HexString.fromBytes(this.buf));
-            return false;
+//            log.info("Node: {}, Length Error: {}, Version: {}, status count: {}, {}", nodeId, this.length, this.buf[INDEX_VERSION],
+//                    this.count, reqLength);
+//            log.error("{}", HexString.fromBytes(this.buf));
+            return -2;
         }
         // 2단계. 체크섬
         this.checkSum = ByteUtils.getUnsignedShort(this.buf, this.buf.length-2);
-        int calcCheckSum = CRC16Utils.CRC16_ccitt_cvim(this.buf, INDEX_LENGTH, this.length-2);  // 시작인덱스가 있으므로 전체길이로 계산
-        if (this.checkSum != calcCheckSum) {
-            log.error("Node: {}, Check Sum Error: Version: {}, recv: {}, calc: {}", nodeId, this.buf[INDEX_VERSION], this.checkSum, calcCheckSum);
-            log.error("{}", HexString.fromBytes(this.buf));
-            return false;
+        this.calcCheckSum = CRC16Utils.CRC16_ccitt_cvim(this.buf, INDEX_LENGTH, this.length-2);  // 시작인덱스가 있으므로 전체길이로 계산
+        if (this.checkSum != this.calcCheckSum) {
+//            log.error("Node: {}, Check Sum Error: Version: {}, recv: {}, calc: {}", nodeId, this.buf[INDEX_VERSION], this.checkSum, this.calcCheckSum);
+//            log.error("{}", HexString.fromBytes(this.buf));
+            return -3;
         }
-        return true;
+        return 0;
     }
 
-    public boolean parsing(TsiNodeVo obj, boolean isCheckPacket) {
+    public int parsing(TsiNodeVo obj, boolean isCheckPacket) {
 
         this.opCode = this.buf[INDEX_OPCODE];
         this.dataVer = this.buf[INDEX_VERSION];
@@ -304,10 +304,11 @@ public class TsiCpuPacket extends AbstractTsiPacket {
         // CVIM 데이터 및 TEST 데이터가 생성됨
         makeCvimPacket();
 
-        if (!checkPacket()) {
+        int result = checkPacket();
+        if (0 != result) {
             if (isCheckPacket) {
                 // 20250425: CRC 체크여부에 따라 바로 리턴(기본값은 체크여부가 true 임)
-                return false;
+                return result;
             }
         }
 
@@ -322,7 +323,7 @@ public class TsiCpuPacket extends AbstractTsiPacket {
             }
             this.nodeData = new byte[addLength];
             System.arraycopy(this.buf, INDEX_NODE_ID, this.nodeData, 0, addLength);
-            return true;
+            return 0;
         }
 
         // 연등지 교차로 데이터 파싱
@@ -393,7 +394,7 @@ public class TsiCpuPacket extends AbstractTsiPacket {
 
         if (addStatus.isEmpty()) {
             // 연등지 정보가 설정된게 없을까???
-            return true;
+            return 0;
         }
 
         // 연등지 노드 카프카 패킷 생성
@@ -423,7 +424,7 @@ public class TsiCpuPacket extends AbstractTsiPacket {
             log.error("NODE: {}, {}", addNodes.get(ii).nodeId, HexString.fromBytes(addNodes.get(ii).getNodeData()));
             log.error("CVIM: {}, {}", addNodes.get(ii).nodeId, HexString.fromBytes(addNodes.get(ii).getCvimData()));
         }*/
-        return true;
+        return 0;
     }
 
     public TcsNodeStatus getNodeStatus() {

+ 6 - 21
src/main/java/com/tsi/comm/server/repository/TsiAlarmManager.java

@@ -37,18 +37,6 @@ public class TsiAlarmManager {
         return (vo != null && vo.isUseYn());
     }
 
-//    public boolean containsKey(String key) {
-//        return this.tsiAlarmConfigMap.containsKey(key);
-//    }
-
-//    public boolean isAlarm(String code, int value) {
-//        TsiAlarmConfigVo vo = get(code);
-//        if (vo != null && vo.isUseYn()) {
-//            return (value > vo.getValue());
-//        }
-//        return false;
-//    }
-
     public void loggingUnknownNode(long nodeId, Channel channel) {
         final String remoteIpAddress = NettyUtils.getRemoteIpAddress(channel);
         if (this.UNKNOWN_NODE_SET.contains(remoteIpAddress)) {
@@ -58,7 +46,11 @@ public class TsiAlarmManager {
 
         final String fileName = "unknown_node";
         MDC.put("report", fileName);
-        log.info("The node ID of the first received packet is not registered: {}, {}", nodeId, remoteIpAddress);
+        if (nodeId > 0) {
+            log.info("Node: {}, {}, unknown node id registered.", nodeId, remoteIpAddress);
+        } else {
+            log.info("Node: {}, {}", nodeId, remoteIpAddress);
+        }
         MDC.remove(fileName);
         MDC.clear();
     }
@@ -69,18 +61,11 @@ public class TsiAlarmManager {
         }
         this.UNKNOWN_NODE_BUF_SET.add(remoteIpAddress);
 
-        final String fileName = "unknown_node";
+        final String fileName = "unknown_node_packet";
         MDC.put("report", fileName);
         log.info("Node: {}, {}, [{}]", nodeId, remoteIpAddress, HexString.fromBytes(buf));
         MDC.remove(fileName);
         MDC.clear();
     }
-    public void loggingAddUnknownNode(long nodeId, Channel channel) {
-        final String fileName = "unknown_node";
-        MDC.put("report", fileName);
-        log.info("Unknown node id registered: {}, {}", nodeId, channel);
-        MDC.remove(fileName);
-        MDC.clear();
-    }
 
 }

+ 28 - 17
src/main/java/com/tsi/comm/server/repository/TsiReportManager.java

@@ -48,7 +48,7 @@ public class TsiReportManager {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         sdf.setTimeZone(java.util.TimeZone.getTimeZone("GMT+9"));
 
-        log.info("{}", String.format("%10s %4s %7s %19s %19s %9s %6s %19s  Remote-Address", "ID", "UNTC", "Connect", "Connect Time", "Disconnect Time", "Connected", "Closed", "Last-Recv-Time"));
+        log.info("{}", String.format("%10s %4s %7s %19s %19s %9s %6s %19s  Remote-Address", "ID", "INTC", "Connect", "Connect Time", "Disconnect Time", "Connected", "Closed", "Last-Recv-Time"));
         log.info("----------------------------------------------------------------------------------------------------------------");
 
 //        this.tsiNodeVoMap.entrySet().stream()
@@ -167,49 +167,60 @@ public class TsiReportManager {
         MDC.clear();
     }
 
-    public void reportQueueInfo() {
+    public void reportQueueInfo(boolean isAlert) {
         final String fileName = "queue";
         MDC.put("report", fileName);
 
+        int remainingCapacity = 0;
+
         log.info("================================================================================================================");
         log.info("Worker Queue Information.");
         List<AbstractTsiCvimWorker> processWorkerList = this.packetProcess.getWorkerList();
-        log.info("----- Packet Worker: {} EA.", processWorkerList.size());
+        remainingCapacity = isAlert ? 100 : this.packetProcess.getQSize();
+        log.info("----- Packet Worker: {} EA, QSize: {} EA.", processWorkerList.size(), this.packetProcess.getQSize());
         List<TsiCvimPacketWorker> packetWorkers = processWorkerList.stream()
                 .filter(worker -> worker instanceof TsiCvimPacketWorker)
                 .map(worker -> (TsiCvimPacketWorker) worker)
                 .collect(Collectors.toList());
         for (TsiCvimPacketWorker worker : packetWorkers) {
-            log.info("{}, Total/Size/Remain: {}/{}/{}, Average: {}",
-                    worker.getIdx(),
-                    worker.getQSize(), worker.getDATA_QUEUE().size(), worker.getDATA_QUEUE().remainingCapacity(),
-                    TimeUtils.elapsedTimeStr(worker.getAvgTime()));
+            if (worker.getDATA_QUEUE().remainingCapacity() <= remainingCapacity) {
+                log.info("{}, Total/Size/Remain: {}/{}/{}, Average: {}",
+                        worker.getIdx(),
+                        worker.getQSize(), worker.getDATA_QUEUE().size(), worker.getDATA_QUEUE().remainingCapacity(),
+                        TimeUtils.elapsedTimeStr(worker.getAvgTime()));
+            }
         }
 
         List<AbstractTsiCvimWorker> dbmsWorkerList = this.dbmsProcess.getWorkerList();
-        log.info("----- Dbms Worker: {} EA.", dbmsWorkerList.size());
+        remainingCapacity = isAlert ? 100 : this.dbmsProcess.getQSize();
+        log.info("----- Dbms Worker: {} EA, QSize: {} EA.", dbmsWorkerList.size(), this.dbmsProcess.getQSize());
         List<TsiCvimDbmsWorker> dbmsWorkers = dbmsWorkerList.stream()
                 .filter(worker -> worker instanceof TsiCvimDbmsWorker)
                 .map(worker -> (TsiCvimDbmsWorker) worker)
                 .collect(Collectors.toList());
         for (TsiCvimDbmsWorker worker : dbmsWorkers) {
-            log.info("{}, Total/Size/Remain: {}/{}/{}, Average: {}",
-                    worker.getIdx(),
-                    worker.getQSize(), worker.getDATA_QUEUE().size(), worker.getDATA_QUEUE().remainingCapacity(),
-                    TimeUtils.elapsedTimeStr(worker.getAvgTime()));
+            if (worker.getDATA_QUEUE().remainingCapacity() <= remainingCapacity) {
+                log.info("{}, Total/Size/Remain: {}/{}/{}, Average: {}",
+                        worker.getIdx(),
+                        worker.getQSize(), worker.getDATA_QUEUE().size(), worker.getDATA_QUEUE().remainingCapacity(),
+                        TimeUtils.elapsedTimeStr(worker.getAvgTime()));
+            }
         }
 
         List<AbstractTsiCvimWorker> loggingWorkerList = this.loggingProcess.getWorkerList();
-        log.info("----- Logging Worker: {} EA.", loggingWorkerList.size());
+        remainingCapacity = isAlert ? 100 : this.loggingProcess.getQSize();
+        log.info("----- Logging Worker: {} EA, QSize: {} EA.", loggingWorkerList.size(), this.loggingProcess.getQSize());
         List<TsiCvimLoggingWorker> loggingWorkers = loggingWorkerList.stream()
                 .filter(worker -> worker instanceof TsiCvimLoggingWorker)
                 .map(worker -> (TsiCvimLoggingWorker) worker)
                 .collect(Collectors.toList());
         for (TsiCvimLoggingWorker worker : loggingWorkers) {
-            log.info("{}, Total/Size/Remain: {}/{}/{}, Average: {}",
-                    worker.getIdx(),
-                    worker.getQSize(), worker.getDATA_QUEUE().size(), worker.getDATA_QUEUE().remainingCapacity(),
-                    TimeUtils.elapsedTimeStr(worker.getAvgTime()));
+            if (worker.getDATA_QUEUE().remainingCapacity() <= remainingCapacity) {
+                log.info("{}, Total/Size/Remain: {}/{}/{}, Average: {}",
+                        worker.getIdx(),
+                        worker.getQSize(), worker.getDATA_QUEUE().size(), worker.getDATA_QUEUE().remainingCapacity(),
+                        TimeUtils.elapsedTimeStr(worker.getAvgTime()));
+            }
         }
         log.info("----------------------------------------------------------------------------------------------------------------");
         log.info("================================================================================================================");

+ 7 - 5
src/main/java/com/tsi/comm/server/scheduler/TsiCommScheduler.java

@@ -100,12 +100,14 @@ public class TsiCommScheduler {
         if (!this.config.isStartup()) {
             return;
         }
-        if (!this.trace.isQueueReport()) {
-            return; // 큐 정보 보고 안함.
+        if (this.trace.isQueueReport()) {
+            Elapsed elapsed = new Elapsed();
+            this.reportManager.reportQueueInfo(false);
+            log.info("{}", String.format("%25s: %s", "reportQueueInformation", TimeUtils.elapsedTimeStr(elapsed.nanoSeconds())));
+        }
+        else {
+            this.reportManager.reportQueueInfo(true);
         }
-        Elapsed elapsed = new Elapsed();
-        this.reportManager.reportQueueInfo();
-        log.info("{}", String.format("%25s: %s", "reportQueueInformation", TimeUtils.elapsedTimeStr(elapsed.nanoSeconds())));
     }
 
     @Async

+ 0 - 2
src/main/java/com/tsi/comm/server/tcp/codec/CvimServerByteBufMessageDecoder.java

@@ -154,8 +154,6 @@ public class CvimServerByteBufMessageDecoder extends MessageToMessageDecoder<Byt
             nodeVo.setRegistered(false);
             this.nodeManager.put(nodeId, nodeVo);
 
-            this.alarmManager.loggingAddUnknownNode(nodeId, channel);
-
             // oops 알람 설정 되어 있으면 알람테이블에 저장하자.
             if (this.alarmManager.checkAlarm(TsiAlarmConfigVo.COMM_01)) {
                 AlarmOccrVo alarm = new AlarmOccrVo(AbstractDbmsVo.DBMS_ALARM_OCCR_HS);

+ 0 - 2
src/main/resources/logback-spring.xml

@@ -105,12 +105,10 @@
     </logger>
 
     <root level="INFO">
-<!--        <appender-ref ref="CONSOLE"/>-->
         <appender-ref ref="FILE_LOG"/>
         <appender-ref ref="FILE_ERROR"/>
     </root>
 
-
     <appender name="FILE_CONFIG" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${LOG_PATH}${LOG_FILE_NAME_CONFIG}</file>
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">