HANTE 1 روز پیش
والد
کامیت
c7bf1a5920
24فایلهای تغییر یافته به همراه246 افزوده شده و 205 حذف شده
  1. 0 1
      conf/tsi-comm-config.pid
  2. 0 1
      conf/tsi-comm-server.pid
  3. 9 10
      src/main/java/com/tsi/comm/server/TsiCommServerApplication.java
  4. 3 3
      src/main/java/com/tsi/comm/server/config/TsiCvimServerConfig.java
  5. 6 6
      src/main/java/com/tsi/comm/server/kafka/KafkaProducerService.java
  6. 3 3
      src/main/java/com/tsi/comm/server/kafka/TsiKafkaConsumerWorker.java
  7. 1 1
      src/main/java/com/tsi/comm/server/mybatis/TsiDatabaseMapper.java
  8. 12 11
      src/main/java/com/tsi/comm/server/mybatis/TsiDatabaseService.java
  9. 1 0
      src/main/java/com/tsi/comm/server/mybatis/vo/NodeStatusVo.java
  10. 4 5
      src/main/java/com/tsi/comm/server/process/dbms/TsiCvimDbmsProcess.java
  11. 8 5
      src/main/java/com/tsi/comm/server/process/dbms/TsiCvimDbmsWorker.java
  12. 2 1
      src/main/java/com/tsi/comm/server/process/logging/TsiCvimLoggingProcess.java
  13. 3 3
      src/main/java/com/tsi/comm/server/process/logging/TsiCvimLoggingWorker.java
  14. 2 1
      src/main/java/com/tsi/comm/server/process/packet/TsiCvimPacketProcess.java
  15. 49 44
      src/main/java/com/tsi/comm/server/process/packet/TsiCvimPacketWorker.java
  16. 79 37
      src/main/java/com/tsi/comm/server/repository/TsiNodeManager.java
  17. 3 3
      src/main/java/com/tsi/comm/server/repository/TsiTpmsManager.java
  18. 4 4
      src/main/java/com/tsi/comm/server/scheduler/TsiCommScheduler.java
  19. 21 29
      src/main/java/com/tsi/comm/server/tcp/codec/CvimServerByteBufMessageDecoder.java
  20. 10 14
      src/main/java/com/tsi/comm/server/tcp/handler/CvimServerInboundMessageHandler.java
  21. 2 0
      src/main/java/com/tsi/comm/server/vo/TsiNodeVo.java
  22. 1 1
      src/main/resources/logback-spring.xml
  23. 23 22
      src/main/resources/mybatis/mapper/tsi-comm-server.xml
  24. BIN
      tsi-comm-server-20240830-0.0.1.jar

+ 0 - 1
conf/tsi-comm-config.pid

@@ -1 +0,0 @@
-95456

+ 0 - 1
conf/tsi-comm-server.pid

@@ -1 +0,0 @@
-2828

+ 9 - 10
src/main/java/com/tsi/comm/server/TsiCommServerApplication.java

@@ -1,6 +1,7 @@
 package com.tsi.comm.server;
 
 import com.tsi.app.common.app.AppUtils;
+import com.tsi.comm.server.config.TsiCvimServerConfig;
 import com.tsi.comm.server.kafka.KafkaConsumerService;
 import com.tsi.comm.server.kafka.KafkaProducerService;
 import com.tsi.comm.server.mybatis.TsiDatabaseService;
@@ -58,15 +59,12 @@ public class TsiCommServerApplication implements CommandLineRunner, ApplicationL
         log.info("** startup: {}", sdfDate.format(new Date()));
         log.info("************************************************************************************");
 
-        TsiAlarmManager.getInstance().getProcessStateVo().setProcessId(applicationName);
+        TsiCvimServerConfig config = (TsiCvimServerConfig) AppUtils.getBean(TsiCvimServerConfig.class);
+        TsiAlarmManager.getInstance().getProcessStateVo().setProcessId(applicationName + "-" + config.getServerId());
 
-/*
-        TsiCvimDbmsProcess tsiCvimDbmsProcess = (TsiCvimDbmsProcess) AppUtils.getBean(TsiCvimDbmsProcess.class);
-
-        TsiCvimLoggingProcess tsiCvimLoggingProcess = (TsiCvimLoggingProcess) AppUtils.getBean(TsiCvimLoggingProcess.class);
-
-        TsiCvimPacketProcess tsiCvimPacketProcess = (TsiCvimPacketProcess) AppUtils.getBean(TsiCvimPacketProcess.class);
-*/
+        TsiDatabaseService tsiDatabaseService = (TsiDatabaseService) AppUtils.getBean(TsiDatabaseService.class);
+        tsiDatabaseService.initDatabase();
+        tsiDatabaseService.loadDatabase();
 
         TsiSessionManager.getInstance().start();
         TsiCvimServer cvimServer = (TsiCvimServer)AppUtils.getBean(TsiCvimServer.class);
@@ -77,7 +75,7 @@ public class TsiCommServerApplication implements CommandLineRunner, ApplicationL
 
         // 시스템 시작 알람 이력 저장
         try {
-            TsiDatabaseService tsiDatabaseService = (TsiDatabaseService) AppUtils.getBean(TsiDatabaseService.class);
+//            TsiDatabaseService tsiDatabaseService = (TsiDatabaseService) AppUtils.getBean(TsiDatabaseService.class);
             AlarmOccrVo alarm = new AlarmOccrVo(AbstractDbmsVo.DBMS_ALARM_OCCR_HS);
             alarm.setAlarmCode(TsiAlarmConfigVo.SYS_00);
             alarm.setAlarmTarget(applicationName);
@@ -107,8 +105,9 @@ public class TsiCommServerApplication implements CommandLineRunner, ApplicationL
 
         TsiDatabaseService tsiDatabaseService = (TsiDatabaseService)AppUtils.getBean(TsiDatabaseService.class);
         try {
+            TsiCvimServerConfig config = (TsiCvimServerConfig) AppUtils.getBean(TsiCvimServerConfig.class);
             // 노드 통신상태 Off 초기화
-            tsiDatabaseService.updateNodeStatusTerm();
+            tsiDatabaseService.updateNodeStatusTerm(config.getServerId());
 
             // 시스템 종료 알람 이력 저장
             AlarmOccrVo alarm = new AlarmOccrVo(AbstractDbmsVo.DBMS_ALARM_OCCR_HS);

+ 3 - 3
src/main/java/com/tsi/comm/server/config/TsiCvimServerConfig.java

@@ -32,15 +32,15 @@ public class TsiCvimServerConfig extends NettyServerConfig {
         }
         if (this.packetWorkers == 0) {
             this.packetWorkers = Runtime.getRuntime().availableProcessors() / 2;
-            if (this.packetWorkers == 0) this.packetWorkers = 1;
+            if (this.packetWorkers == 0) this.packetWorkers = 16;
         }
         if (this.loggingWorkers == 0) {
             this.loggingWorkers = Runtime.getRuntime().availableProcessors() / 4;
-            if (this.loggingWorkers == 0) this.loggingWorkers = 1;
+            if (this.loggingWorkers == 0) this.loggingWorkers = 4;
         }
         if (this.dbmsWorkers == 0) {
             this.dbmsWorkers = Runtime.getRuntime().availableProcessors() / 4;
-            if (this.dbmsWorkers == 0) this.dbmsWorkers = 1;
+            if (this.dbmsWorkers == 0) this.dbmsWorkers = 8;
         }
         if (getReaderIdleTimeSeconds() <= 5) {
             setReaderIdleTimeSeconds(5);

+ 6 - 6
src/main/java/com/tsi/comm/server/kafka/KafkaProducerService.java

@@ -34,7 +34,7 @@ public class KafkaProducerService {
 
     private final TsiCvimServerConfig config;
     private final TsiKafkaProducerConfig producerConfig;
-    private final TsiCvimDbmsProcess tsiCvimDbmsService;
+    private final TsiCvimDbmsProcess dbmsProcess;
 
     private KafkaTemplate<String, byte[]> cvimProducer;
     private KafkaTemplate<String, byte[]> nodeProducer;
@@ -44,10 +44,10 @@ public class KafkaProducerService {
 
     //ProducerResultCallback callback;
 
-    public KafkaProducerService(TsiCvimServerConfig config, TsiKafkaProducerConfig producerConfig, TsiCvimDbmsProcess tsiCvimDbmsService) {
+    public KafkaProducerService(TsiCvimServerConfig config, TsiKafkaProducerConfig producerConfig, TsiCvimDbmsProcess dbmsProcess) {
         this.config = config;
         this.producerConfig = producerConfig;
-        this.tsiCvimDbmsService = tsiCvimDbmsService;
+        this.dbmsProcess = dbmsProcess;
     }
 
     @PostConstruct
@@ -183,7 +183,7 @@ public class KafkaProducerService {
                         alarm.setAlarmCode(TsiAlarmConfigVo.KAFKA_02);
                         alarm.setAlarmTarget(producerConfig.getBootstrapServers());
                         alarm.setAlarmValue(Long.toString(sendTime));
-                        tsiCvimDbmsService.add(alarm, (int) Thread.currentThread().getId());
+                        dbmsProcess.add(alarm, (int) Thread.currentThread().getId());
                     }
                 }
             }
@@ -196,7 +196,7 @@ public class KafkaProducerService {
                 stat.setStatus(0);
                 stat.setSendTm(TimeUnit.MICROSECONDS.convert(Math.abs(recvNanoTime - sendNanoTime), TimeUnit.NANOSECONDS));
                 stat.setRecvTm(0);
-                tsiCvimDbmsService.add(stat, (int)Thread.currentThread().getId());
+                dbmsProcess.add(stat, (int)Thread.currentThread().getId());
                 log.error("send ping failed: {}, {}, {}", sendNanoTime, TimeUtils.elapsedTimeStr(recvNanoTime - sendNanoTime), ex.getMessage());
 
                 // 카프카 전송 오류 알람 저장
@@ -208,7 +208,7 @@ public class KafkaProducerService {
                 alarm.setAlarmCode(TsiAlarmConfigVo.KAFKA_01);
                 alarm.setAlarmTarget(producerConfig.getBootstrapServers());
                 alarm.setAlarmValue(value);
-                tsiCvimDbmsService.add(alarm, (int)Thread.currentThread().getId());
+                dbmsProcess.add(alarm, (int)Thread.currentThread().getId());
 
             }
         });

+ 3 - 3
src/main/java/com/tsi/comm/server/kafka/TsiKafkaConsumerWorker.java

@@ -16,10 +16,10 @@ import java.util.concurrent.TimeUnit;
 @Slf4j
 public class TsiKafkaConsumerWorker implements MessageListener<String, Long> {
 
-    private TsiCvimDbmsProcess tsiCvimDbmsService;
+    private final TsiCvimDbmsProcess dbmsProcess;
 
     public TsiKafkaConsumerWorker() {
-        this.tsiCvimDbmsService = (TsiCvimDbmsProcess) AppUtils.getBean(TsiCvimDbmsProcess.class);
+        this.dbmsProcess = (TsiCvimDbmsProcess) AppUtils.getBean(TsiCvimDbmsProcess.class);
     }
 
     @Override
@@ -39,7 +39,7 @@ public class TsiKafkaConsumerWorker implements MessageListener<String, Long> {
             stat.setSendTm(stat.getRecvTm());
             log.info("recv ping success, sendNanoTime miss match: {}, {}", sendNanoTime, TimeUtils.elapsedTimeStr(recvNanoTime - sendNanoTime));
         }
-        tsiCvimDbmsService.add(stat, (int)Thread.currentThread().getId());
+        dbmsProcess.add(stat, (int)Thread.currentThread().getId());
         log.info("recv ping success: {}, {}", sendNanoTime, TimeUtils.elapsedTimeStr(recvNanoTime - sendNanoTime));
     }
 

+ 1 - 1
src/main/java/com/tsi/comm/server/mybatis/TsiDatabaseMapper.java

@@ -15,7 +15,7 @@ public interface TsiDatabaseMapper {
     List<NodeVo> getNodeInfoList();
     List<NodeAddVo> getNodeAddInfoList();
     int insertNodeStatusInitialize();
-    int updateNodeStatusTerm();
+    int updateNodeStatusTerm(@Param("serverId") Integer serverId);
 
     int updateNodeStatus(@Param("stts") NodeStatusVo login);
 

+ 12 - 11
src/main/java/com/tsi/comm/server/mybatis/TsiDatabaseService.java

@@ -1,6 +1,5 @@
 package com.tsi.comm.server.mybatis;
 
-import com.tsi.app.common.app.AppUtils;
 import com.tsi.app.common.utils.TimeUtils;
 import com.tsi.comm.server.mybatis.vo.*;
 import com.tsi.comm.server.repository.TsiAlarmManager;
@@ -11,6 +10,7 @@ import com.tsi.comm.server.vo.TsiNodeAddDetailVo;
 import com.tsi.comm.server.vo.TsiNodeAddVo;
 import com.tsi.comm.server.vo.TsiNodeVo;
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -21,19 +21,16 @@ import java.util.List;
 @Slf4j
 @Getter
 @Setter
+@RequiredArgsConstructor
 @Service
 public class TsiDatabaseService {
 
-    private TsiDatabaseMapper tsiDatabaseMapper;
-
-    public TsiDatabaseService() {
-    }
+    private final TsiDatabaseMapper tsiDatabaseMapper;
 
     @PostConstruct
     void init() {
-        this.tsiDatabaseMapper = (TsiDatabaseMapper) AppUtils.getBean(TsiDatabaseMapper.class);
-        initDatabase();
-        loadDatabase();
+//        initDatabase();
+//        loadDatabase();
     }
 
     public void loadAlarmConfig() {
@@ -63,7 +60,7 @@ public class TsiDatabaseService {
 
     public void initDatabase() {
         int result = this.tsiDatabaseMapper.insertNodeStatusInitialize();
-        updateNodeStatusTerm();
+        //updateNodeStatusTerm();
         log.info("init database: {} EA", result);
     }
 
@@ -82,6 +79,7 @@ public class TsiDatabaseService {
         boolean installed;
         TsiNodeVo node;
 
+        int idx = 0;
         List<NodeVo> objLists = this.tsiDatabaseMapper.getNodeInfoList();
         for (NodeVo obj : objLists) {
             installed = obj.getUseYn().equals("Y");
@@ -99,6 +97,9 @@ public class TsiDatabaseService {
                 node.setCheckInstalled(installed);
                 TsiNodeManager.getInstance().put(obj.getNodeId(), node);
             }
+            node.setIdx(idx++);  // 인덱스 설정
+            //int hash = Long.hashCode(obj.getNodeId()); // 해시코드 생성, 필요시 사용
+            //int idx = Math.abs(hash % 9);
         }
 
         TsiNodeManager.getInstance().afterLoading();
@@ -170,8 +171,8 @@ public class TsiDatabaseService {
         log.info("{}: ..end. {} EA. {}", TAG, TsiNodeAddManager.getInstance().size(), TimeUtils.elapsedTime(startTime));
     }
 
-    public void updateNodeStatusTerm() {
-        int result = this.tsiDatabaseMapper.updateNodeStatusTerm();
+    public void updateNodeStatusTerm(int serverId) {
+        int result = this.tsiDatabaseMapper.updateNodeStatusTerm(serverId);
         log.info("update node status term: {} EA", result);
     }
     public int insertAlarmOccrHs(AlarmOccrVo vo) {

+ 1 - 0
src/main/java/com/tsi/comm/server/mybatis/vo/NodeStatusVo.java

@@ -9,6 +9,7 @@ import lombok.ToString;
 @ToString
 public class NodeStatusVo extends AbstractDbmsVo {
 
+    private int serverId;
     private long nodeId;
     private int status;
     private String ipAddr;

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

@@ -6,6 +6,7 @@ import com.tsi.comm.server.process.AbstractTsiCvimProcess;
 import com.tsi.comm.server.process.AbstractTsiCvimWorker;
 import com.tsi.comm.server.repository.TsiNodeManager;
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -13,12 +14,10 @@ import javax.annotation.PostConstruct;
 
 @Slf4j
 @Getter
+@RequiredArgsConstructor
 @Service
 public class TsiCvimDbmsProcess extends AbstractTsiCvimProcess {
 
-    public TsiCvimDbmsProcess() {
-    }
-
     @PostConstruct
     void init() {
         ThreadGroup workerGroup = new ThreadGroup("dbmsProcess");
@@ -51,7 +50,8 @@ public class TsiCvimDbmsProcess extends AbstractTsiCvimProcess {
     public boolean add(Object object, int idx) {
         boolean offer = false;
         try {
-            idx = idx % this.workers;
+            //idx = idx % this.workers;
+            idx = Math.abs(idx % this.workers);
             offer = this.workerList.get(idx).add(object);
         }
         catch (Exception e) {
@@ -61,7 +61,6 @@ public class TsiCvimDbmsProcess extends AbstractTsiCvimProcess {
     }
 
     public void stop() {
-
     }
 
     public void report() {

+ 8 - 5
src/main/java/com/tsi/comm/server/process/dbms/TsiCvimDbmsWorker.java

@@ -38,7 +38,7 @@ public class TsiCvimDbmsWorker extends AbstractTsiCvimWorker implements Runnable
                 }
             }
             catch (Exception e) {
-                log.error("Exception: {}", e.getMessage());
+                log.error("Exception(DbmsWorker while): {}", e.getMessage());
             }
         }
     }
@@ -53,11 +53,11 @@ public class TsiCvimDbmsWorker extends AbstractTsiCvimWorker implements Runnable
             //add   => full -> wait
             offer = this.DATA_QUEUE.offer(object);
             if (!offer) {
-                log.error("Packet Queue.offer: {}/{}, Queue Full: {} EA, {}, {}",
-                        object.getClass().getSimpleName(), this.DATA_QUEUE.size(), this.qSize, object, Thread.currentThread().getName());
+                log.error("Dbms Queue.offer: {}/{}, {}, Queue Full: {} EA, {}, {}",
+                        object.getClass().getSimpleName(), this.DATA_QUEUE.size(), this.idx, this.qSize, object, Thread.currentThread().getName());
             }
         } catch (Exception e) {
-            log.error("Packet Queue.offer: Exception: {}, {}, {}", object.toString(), Thread.currentThread().getName(), e.getMessage());
+            log.error("Dbms Queue.offer: Exception: {}, {}, {}", object.toString(), Thread.currentThread().getName(), e.getMessage());
         }
         return offer;
     }
@@ -101,7 +101,10 @@ public class TsiCvimDbmsWorker extends AbstractTsiCvimWorker implements Runnable
             log.error("Unknown Object Class: {}", object.getClass().getSimpleName());
         }
 
-        log.info("{}: {} EA. {} {}", job, count, TimeUtils.elapsedTimeStr(elapsed.nanoSeconds()), Thread.currentThread().getName());
+        if (elapsed.milliSeconds() > 500) {
+            // 로그가 너무 많아 일정 시간 이상 걸리는 경우만 로그로 남긴다.
+            log.warn("{}: {} EA. {} {}", job, count, TimeUtils.elapsedTimeStr(elapsed.nanoSeconds()), Thread.currentThread().getName());
+        }
     }
 
     public void report() {

+ 2 - 1
src/main/java/com/tsi/comm/server/process/logging/TsiCvimLoggingProcess.java

@@ -53,7 +53,8 @@ public class TsiCvimLoggingProcess extends AbstractTsiCvimProcess {
         boolean offer = false;
         AbstractTsiPacket packet = (AbstractTsiPacket)object;
         try {
-            idx = idx % this.workers;
+//            idx = idx % this.workers;
+            idx = Math.abs(idx % this.workers);
             offer = this.workerList.get(idx).add(packet);
         }
         catch (Exception e) {

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

@@ -44,7 +44,7 @@ public class TsiCvimLoggingWorker extends AbstractTsiCvimWorker implements Runna
                 }
             }
             catch (Exception e) {
-                log.error("Exception: {}", e.getMessage());
+                log.error("Exception(LoggingWorker while): {}", e.getMessage());
             }
         }
     }
@@ -61,8 +61,8 @@ public class TsiCvimLoggingWorker extends AbstractTsiCvimWorker implements Runna
             offer = this.DATA_QUEUE.offer(packet);
             if (!offer) {
                 MDC.put("id", Long.toString(packet.getNodeId()));
-                log.error("Logging Queue.offer: {}/{}, Queue Full: {} EA, {}, {}",
-                        packet.getNodeId(), this.DATA_QUEUE.size(), this.qSize, TimeUtils.elapsedTime(packet.getRcv()), Thread.currentThread().getName());
+                log.error("Logging Queue.offer: {}/{}, {}, Queue Full: {} EA, {}, {}",
+                        packet.getNodeId(), this.DATA_QUEUE.size(), this.idx, this.qSize, TimeUtils.elapsedTime(packet.getRcv()), Thread.currentThread().getName());
                 MDC.clear();
             }
         } catch (Exception e) {

+ 2 - 1
src/main/java/com/tsi/comm/server/process/packet/TsiCvimPacketProcess.java

@@ -56,7 +56,8 @@ public class TsiCvimPacketProcess extends AbstractTsiCvimProcess {
         boolean offer = false;
         AbstractTsiPacket packet = (AbstractTsiPacket)object;
         try {
-            idx = idx % this.workers;
+//            idx = idx % this.workers;
+            idx = Math.abs(idx % this.workers);
             offer = this.workerList.get(idx).add(packet);
         }
         catch (Exception e) {

+ 49 - 44
src/main/java/com/tsi/comm/server/process/packet/TsiCvimPacketWorker.java

@@ -39,8 +39,9 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
     public void run() {
         log.info("{} Start. QSIZE: {}", Thread.currentThread().getName(), this.qSize);
         while (true) {
+            Object packet = null;
             try {
-                Object packet = this.DATA_QUEUE.take();
+                packet = this.DATA_QUEUE.take();
                 if (packet != null) {
                     process(packet);
                 }
@@ -49,7 +50,16 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
                 }
             }
             catch (Exception e) {
-                log.error("Exception: {}", e.getMessage());
+                if (packet != null) {
+                    TsiCpuPacket cpuPacket = (TsiCpuPacket)((AbstractTsiPacket)packet);
+                    TsiNodeVo nodeVo = (TsiNodeVo)cpuPacket.getObj();
+                    if (nodeVo != null) {
+                        log.warn(" Node: {}, Network Conn: {}", nodeVo.getKey(), nodeVo.isConnect());
+                    }
+                }
+                else {
+                    log.error("Exception(PacketWorker while): {}", e.getMessage());
+                }
             }
         }
     }
@@ -66,8 +76,8 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
             offer = this.DATA_QUEUE.offer(packet);
             if (!offer) {
                 MDC.put("id", Long.toString(packet.getNodeId()));
-                log.error("Packet Queue.offer: {}/{}, Queue Full: {} EA, {}, {}",
-                        packet.getNodeId(), this.DATA_QUEUE.size(), this.qSize, TimeUtils.elapsedTime(packet.getRcv()), Thread.currentThread().getName());
+                log.error("Packet Queue.offer: {}/{}, {}, Queue Full: {} EA, {}, {}",
+                        packet.getNodeId(), this.DATA_QUEUE.size(), this.idx, this.qSize, TimeUtils.elapsedTime(packet.getRcv()), Thread.currentThread().getName());
                 MDC.clear();
             }
         } catch (Exception e) {
@@ -82,6 +92,13 @@ 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());
+        if (nodeVo == null) {
+            // 노드 정보가 없는 경우
+            log.error("Packet process NodeVo is null: {}, {}", packet.getNodeId(), Thread.currentThread().getName());
+            return;
+        }
+
+        int loggingIdx = nodeVo.getIdx();
 
         long curr = System.nanoTime();
         if (TimeUnit.MILLISECONDS.convert(curr - packet.getRcv(), TimeUnit.NANOSECONDS) > 3000) {
@@ -93,24 +110,22 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
         if (packet.getOpCode() == (byte) eOpCode.TSI_CPU_DISCONNECTED.getValue()) {
             TsiCpuDisconnected disconnected = (TsiCpuDisconnected)packet;
             disconnected.parsing(nodeVo);
-            if (nodeVo != null) {
-                if (nodeVo.isSendCvim() && disconnected.getCvimData() != null) {
-                    this.kafkaProducer.sendCvim(disconnected.getNodeId(), disconnected.getCvimData());
-                }
+            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());
                 }
-                this.loggingService.add(packet, this.idx);//(int)Thread.currentThread().getId());
             }
+            this.loggingService.add(packet, loggingIdx);//(int)Thread.currentThread().getId());
             return;
         }
 
         // 메모리에서 객체를 찾은 후 패킷 파싱
-        // 20250425: packet parsing의 로그를 노드별 로그파일에 저장되도록 MDC 위치 변경
+        // 20250425: packet parsing 의 로그를 노드별 로그파일에 저장되도록 MDC 위치 변경
         // 20250425: parsing 함수에 packet-check 여부를 같이 넘겨줘서 CRC 체크여부 확인
         MDC.put("id", nodeVo.getKey());
         if (!cpuPacket.parsing(nodeVo, this.cvimServerConfig.isCheckPacket())) {
@@ -123,44 +138,34 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
         packet.setPar(System.nanoTime());
 
         // 카프카 전송
-        if (nodeVo != null) {
-            if (nodeVo.isSendNode() && packet.getNodeData() != null) {
-                this.kafkaProducer.sendNode(Long.toString(packet.getNodeId()), packet.getNodeData());
-            }
-            if (nodeVo.isSendTest()) {
-                this.kafkaProducer.sendTest(packet.getNodeId(), packet.getTestData());
-            }
-            if (nodeVo.isSendCvim() && packet.getCvimData() != null) {
-                this.kafkaProducer.sendCvim(packet.getNodeId(), packet.getCvimData());
-            }
+        if (nodeVo.isSendNode() && packet.getNodeData() != null) {
+            this.kafkaProducer.sendNode(Long.toString(packet.getNodeId()), packet.getNodeData());
+        }
+        if (nodeVo.isSendTest()) {
+            this.kafkaProducer.sendTest(packet.getNodeId(), packet.getTestData());
+        }
+        if (nodeVo.isSendCvim() && packet.getCvimData() != null) {
+            this.kafkaProducer.sendCvim(packet.getNodeId(), 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());
                 }
             }
         }
-        else {
-            // 여기 들어오면 안됌
-            MDC.put("id", Long.toString(packet.getNodeId()));
-            log.warn("Not found node object: {}", packet.getNodeId());
-            MDC.clear();
-            // kafka send to topic-for-ssd-test only
-            this.kafkaProducer.sendTest(packet.getNodeId(), packet.getTestData());
-        }
 
         packet.setEnd(System.nanoTime());
 
         packet.setAvg(calcProcessTime(packet.getRcv()));
 
         // 로그큐로 전송한다.
-        this.loggingService.add(packet, this.idx);//(int)Thread.currentThread().getId());
+        this.loggingService.add(packet, loggingIdx);//(int)Thread.currentThread().getId());
 
         // 연등지 인 경우
         if (cpuPacket.getAddNodes() != null) {
@@ -170,7 +175,7 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
                 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), this.idx);
+                this.loggingService.add(cpuPacket.getAddNodes().get(ii), loggingIdx);
             }
         }
 

+ 79 - 37
src/main/java/com/tsi/comm/server/repository/TsiNodeManager.java

@@ -31,12 +31,12 @@ public class TsiNodeManager {
 
     private TsiNodeManager() {
         this.tsiNodeVoMap = new ConcurrentHashMap<>();
-        this.tsiCvimDbmsService = (TsiCvimDbmsProcess) AppUtils.getBean(TsiCvimDbmsProcess.class);
+        this.dbmsProcess = (TsiCvimDbmsProcess) AppUtils.getBean(TsiCvimDbmsProcess.class);
     }
 
     private ConcurrentHashMap<Long, TsiNodeVo> tsiNodeVoMap;
     // DB Process Service
-    private TsiCvimDbmsProcess tsiCvimDbmsService;
+    private TsiCvimDbmsProcess dbmsProcess;
 
     public TsiNodeVo get(long nodeId) {
         return this.tsiNodeVoMap.get(nodeId);
@@ -77,45 +77,84 @@ public class TsiNodeManager {
     public void reportNodeSessions() {
         log.info("================================================================================================================");
         log.info("Report Node Sessions: {} Nodes.", this.tsiNodeVoMap.size());
+
         int registered = 0;
         int unknown = 0;
         int connected = 0;
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         sdf.setTimeZone(java.util.TimeZone.getTimeZone("GMT+9"));
-        String connect;
-        String connectTm;
-        String disconnectTm;
-        String lastCommTm;
-        String info;
+
         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("----------------------------------------------------------------------------------------------------------------");
-        for (Map.Entry<Long, TsiNodeVo> obj : this.tsiNodeVoMap.entrySet()) {
-            TsiNodeVo node = obj.getValue();
-            String check = (node.isInstalled() ? "Y" : "N");
-            check = check + (node.isSendNode() ? "Y" : "N");
-            check = check + (node.isSendTest() ? "Y" : "N");
-            check = check + (node.isSendCvim() ? "Y" : "N");
-            if (node.isRegistered()) {
-                registered++;
-            }
-            else {
-                unknown++;
-            }
-            if (node.isConnect()) {
-                connected++;
-                connect = "Y";
-                info = NettyUtils.getRemoteAddress(node.getChannel());
-            }
-            else {
-                connect = "N";
-                info = "---";
-            }
-
-            connectTm = sdf.format(new Date(node.getConnectTm()));
-            disconnectTm = sdf.format(new Date(node.getDisconnectTm()));
-            lastCommTm = sdf.format(new Date(node.getLastCommTm()));
 
-            log.info("{}", String.format("%10s %4s %7s %19s %19s %9d %6d %19s  %s", node.getKey(), check, connect, connectTm, disconnectTm, node.getConnectCount().get(), node.getDisconnectCount().get(), lastCommTm, info));
+//        this.tsiNodeVoMap.entrySet().stream()
+//                .sorted(Map.Entry.comparingByKey()) // 키값 기준 오름차순 정렬
+//                .forEach(entry -> {
+//                    TsiNodeVo node = entry.getValue();
+//                    String check = (node.isInstalled() ? "Y" : "N")
+//                            + (node.isSendNode() ? "Y" : "N")
+//                            + (node.isSendTest() ? "Y" : "N")
+//                            + (node.isSendCvim() ? "Y" : "N");
+//
+//                    if (node.isRegistered()) {
+//                        registered.getAndIncrement();
+//                    } else {
+//                        unknown++;
+//                    }
+//
+//                    String connect;
+//                    String info;
+//                    if (node.isConnect()) {
+//                        connected++;
+//                        connect = "Y";
+//                        info = NettyUtils.getRemoteAddress(node.getChannel());
+//                    } else {
+//                        connect = "N";
+//                        info = "---";
+//                    }
+//
+//                    String connectTm = sdf.format(new Date(node.getConnectTm()));
+//                    String disconnectTm = sdf.format(new Date(node.getDisconnectTm()));
+//                    String lastCommTm = sdf.format(new Date(node.getLastCommTm()));
+//
+//                    log.info("{}", String.format(
+//                            "%10s %4s %7s %19s %19s %9d %6d %19s  %s",
+//                            node.getKey(), check, connect, connectTm,
+//                            disconnectTm, node.getConnectCount().get(),
+//                            node.getDisconnectCount().get(), lastCommTm, info
+//                    ));
+//                });
+//
+         for (Map.Entry<Long, TsiNodeVo> obj : this.tsiNodeVoMap.entrySet()) {
+             TsiNodeVo node = obj.getValue();
+             String check = (node.isInstalled() ? "Y" : "N");
+             check = check + (node.isSendNode() ? "Y" : "N");
+             check = check + (node.isSendTest() ? "Y" : "N");
+             check = check + (node.isSendCvim() ? "Y" : "N");
+             if (node.isRegistered()) {
+                 registered++;
+             }
+             else {
+                 unknown++;
+             }
+
+             String connect;
+             String info;
+             if (node.isConnect()) {
+                 connected++;
+                 connect = "Y";
+                 info = NettyUtils.getRemoteAddress(node.getChannel());
+             }
+             else {
+                 connect = "N";
+                 info = "---";
+             }
+
+             String connectTm = sdf.format(new Date(node.getConnectTm()));
+             String disconnectTm = sdf.format(new Date(node.getDisconnectTm()));
+             String lastCommTm = sdf.format(new Date(node.getLastCommTm()));
+
+             log.info("{}", String.format("%10s %4s %7s %19s %19s %9d %6d %19s  %s", node.getKey(), check, connect, connectTm, disconnectTm, node.getConnectCount().get(), node.getDisconnectCount().get(), lastCommTm, info));
         }
         log.info("----------------------------------------------------------------------------------------------------------------");
         log.info("Total Nodes: {} EA, Registered: {} EA, Unknown: {} EA, Connected: {} EA", this.tsiNodeVoMap.size(), registered, unknown, connected);
@@ -138,15 +177,18 @@ public class TsiNodeManager {
                         alarm.setAlarmCode(TsiAlarmConfigVo.COMM_02);
                         alarm.setAlarmTarget(node.getKey());
                         alarm.setAlarmValue(NettyUtils.getRemoteIpAddress(node.getChannel()));
-                        this.tsiCvimDbmsService.add(alarm, (int) Thread.currentThread().getId());
+//                        this.dbmsProcess.add(alarm, (int) Thread.currentThread().getId());
 
                         connectTm = sdf.format(new Date(node.getConnectTm()));
                         lastCommTm = sdf.format(new Date(node.getLastCommTm()));
-                        log.warn("Node: {}, Recv Timeout: Connect: {}, LastCommTime: {}", node.getKey(), connectTm, lastCommTm);
-                        node.getChannel().close();
+                        log.warn("Node: {}, Recv Timeout: Connect: {}, LastCommTime: {}, timeout: {}",
+                                node.getKey(), connectTm, lastCommTm, timeout);
+
+//                        node.getChannel().disconnect();
+//                        node.getChannel().close();
                     }
                     catch (Exception e) {
-                        log.error("{}", e.getMessage());
+                        log.error("checkSessionTimeout: {}", e.getMessage());
                     }
                 }
             }

+ 3 - 3
src/main/java/com/tsi/comm/server/repository/TsiTpmsManager.java

@@ -32,13 +32,13 @@ public class TsiTpmsManager {
         this.readBPS = new Counter();
         this.readBPM = new Counter();
         this.readBPD = new Counter();
+        this.dbmsProcess = (TsiCvimDbmsProcess) AppUtils.getBean(TsiCvimDbmsProcess.class);
         this.kafkaTransVo = new KafkaTransVo(AbstractDbmsVo.DBMS_KAFKA_TRANS_HS);
         this.kafkaTransVo.setHostName(NetUtils.getHostName());
-        this.tsiCvimDbmsService = (TsiCvimDbmsProcess) AppUtils.getBean(TsiCvimDbmsProcess.class);
     }
 
     // DB Process Service
-    private TsiCvimDbmsProcess tsiCvimDbmsService;
+    private TsiCvimDbmsProcess dbmsProcess;
 
     // 패킷 수
     private Counter readTPS;    // read transaction per seconds
@@ -74,7 +74,7 @@ public class TsiTpmsManager {
         stat.setTrans(trans);
         stat.setBytes(bytes);
         stat.setSessions(TsiSessionManager.getInstance().get());
-        this.tsiCvimDbmsService.add(stat, (int)Thread.currentThread().getId());
+        this.dbmsProcess.add(stat, (int)Thread.currentThread().getId());
 
         /*log.info("Second Statistics: {} sessions, {} TRX, {}. {}",
                 TsiSessionManager.getInstance().get(),

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

@@ -9,7 +9,6 @@ import com.tsi.comm.server.kafka.KafkaProducerService;
 import com.tsi.comm.server.mybatis.TsiDatabaseService;
 import com.tsi.comm.server.repository.TsiAlarmManager;
 import com.tsi.comm.server.repository.TsiNodeManager;
-import com.tsi.comm.server.repository.TsiSessionManager;
 import com.tsi.comm.server.repository.TsiTpmsManager;
 import com.tsi.comm.server.vo.TsiAlarmConfigVo;
 import lombok.AllArgsConstructor;
@@ -64,7 +63,8 @@ public class TsiCommScheduler {
         long timeout = 0;
         TsiAlarmConfigVo vo = TsiAlarmManager.getInstance().get(TsiAlarmConfigVo.COMM_02);
         if (vo == null) return; // 이거면 안됌.
-        timeout = vo.getValue() * 1000;
+        timeout = vo.getValue() * 1000L;
+//        timeout *= 3; // 3배로 늘려서 체크
         if (timeout <= 0) {
             log.error("checkSessionTimeout: timeout value error: {}", timeout);
             return;
@@ -74,11 +74,11 @@ public class TsiCommScheduler {
     }
 
     @Async
-    @Scheduled(cron = "0/10 * * * * *")  // 10초 주기 작업 실행
+    @Scheduled(cron = "0/30 * * * * *")  // 30초 주기 작업 실행
     public void reportNodeSessionAlive() {
         Elapsed elapsed = new Elapsed();
         TsiNodeManager.getInstance().reportNodeSessions();
-        TsiSessionManager.getInstance().reportChannelSessions();
+//        TsiSessionManager.getInstance().reportChannelSessions();
         log.info("{}", String.format("%25s: %s", "reportNodeSessionAlive", TimeUtils.elapsedTimeStr(elapsed.nanoSeconds())));
     }
 

+ 21 - 29
src/main/java/com/tsi/comm/server/tcp/codec/CvimServerByteBufMessageDecoder.java

@@ -1,9 +1,9 @@
 package com.tsi.comm.server.tcp.codec;
 
-import com.tsi.app.common.app.AppUtils;
 import com.tsi.app.common.utils.SysUtils;
 import com.tsi.app.common.utils.TimeUtils;
 import com.tsi.app.common.xnet.NettyUtils;
+import com.tsi.comm.server.config.TsiCvimServerConfig;
 import com.tsi.comm.server.mybatis.vo.AbstractDbmsVo;
 import com.tsi.comm.server.mybatis.vo.AlarmOccrVo;
 import com.tsi.comm.server.mybatis.vo.NodeStatusVo;
@@ -21,6 +21,7 @@ import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.handler.codec.MessageToMessageDecoder;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -28,35 +29,16 @@ import java.util.List;
 
 @Slf4j
 @Component
+@RequiredArgsConstructor
 @ChannelHandler.Sharable
 public class CvimServerByteBufMessageDecoder extends MessageToMessageDecoder<ByteBuf> {
 
-    private final TsiCvimPacketProcess tsiCvimPacketService;
-    private final TsiCvimDbmsProcess tsiCvimDbmsService;
-
-    public CvimServerByteBufMessageDecoder(TsiCvimDbmsProcess tsiCvimDbmsService) {
-        this.tsiCvimDbmsService = tsiCvimDbmsService;
-        this.tsiCvimPacketService = (TsiCvimPacketProcess) AppUtils.getBean(TsiCvimPacketProcess.class);
-    }
-    /*@Override
-    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
-        log.error("userEventTriggered: {}", NettyUtils.getRemoteIpAddress(ctx.channel()));
-        ctx.fireUserEventTriggered(evt);
-    }*/
+    private final TsiCvimServerConfig config;
+    private final TsiCvimPacketProcess packetProcess;
+    private final TsiCvimDbmsProcess dbmsProcess;
 
     @Override
     protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> list) throws Exception {
-
-        /*
-        Set<Thread> threads = Thread.getAllStackTraces().keySet();
-        for (Thread t : threads) {            String name = t.getName();
-            Thread.State state = t.getState();
-            int priority = t.getPriority();
-            String type = t.isDaemon() ? "Daemon" : "Normal";
-            String msg = String.format("Receive: %-20s \t %s \t %d \t %s\n", name, state, priority, type);
-            log.info(msg);
-        }*/
-
         try {
             long msec = TimeUtils.currentTimeSeconds();
             long nsec = System.nanoTime();
@@ -79,16 +61,22 @@ public class CvimServerByteBufMessageDecoder extends MessageToMessageDecoder<Byt
             if (nodeVo == null) {
                 // not found node information from channel map
                 nodeVo = attachNodeVo(nodeId, ctx.channel());
+                if (nodeVo == null) {
+                    // node id 가 0 이하로 설정되어 있거나, 노드 정보가 등록되어 있지 않은 경우
+                    ctx.close();
+                    return;
+                }
 
                 // first connection, save node information to channel attribute map
                 ctx.channel().attr(TsiSessionManager.TSI_NODE_ATTRIBUTE_KEY).set(nodeVo);
 
                 NodeStatusVo status = new NodeStatusVo(AbstractDbmsVo.DBMS_NODE_STATUS);
+                status.setServerId(this.config.getServerId());
                 status.setNodeId(nodeId);
                 status.setStatus(1);
                 status.setIpAddr(NettyUtils.getRemoteIpAddress(ctx.channel()));
                 if (TsiSessionManager.getInstance().isServerRun()) {
-                    this.tsiCvimDbmsService.add(status, (int)Thread.currentThread().getId());
+                    this.dbmsProcess.add(status, (int)Thread.currentThread().getId());
                 }
                 else {
                     log.error("Node Login but server not running: {}", status.toString());
@@ -96,13 +84,14 @@ public class CvimServerByteBufMessageDecoder extends MessageToMessageDecoder<Byt
             }
 
             nodeVo.setLastCommTm(System.currentTimeMillis());   // 통신 수신시각 저장
+
             TsiCpuPacket packet = new TsiCpuPacket(nodeId, msec, nsec, ctx.channel());
             packet.setBuf(new byte[readableBytes]);
             byteBuf.readBytes(packet.getBuf());
             packet.setObj(nodeVo);  // TsiNodeVo 객체를 저장
 
             // 작업큐로 데이터 전송
-            this.tsiCvimPacketService.add(packet, (int)Thread.currentThread().getId());
+            this.packetProcess.add(packet, nodeVo.getIdx());
 
             // 작업큐 데이터 전송 시각 셋
             packet.setAdd(System.nanoTime());
@@ -128,8 +117,11 @@ public class CvimServerByteBufMessageDecoder extends MessageToMessageDecoder<Byt
             // 원래는 종료 시켜야 하나.....
             // 신규로 해당 노드정보 메로리를 생성해서 메모리 맵에 추가한다.
 
-            log.warn("첫번째 수신한 패킷의 노드 ID 가 등록되어 있지 않음: {}, {}", nodeId, channel);
-
+            log.warn("The node ID of the first received packet is not registered..: {}, {}", nodeId, channel);
+            if (nodeId <= 0) {
+                log.error("Node ID is set to 0 or less. Node ID: {}, Channel: {}", nodeId, channel);
+                return null; // 잘못된 노드 ID인 경우 null 반환
+            }
             nodeVo = new TsiNodeVo(nodeId, false, true, true);
             nodeVo.setCheckInstalled(true);
             nodeVo.setRegistered(false);
@@ -141,7 +133,7 @@ public class CvimServerByteBufMessageDecoder extends MessageToMessageDecoder<Byt
                 alarm.setAlarmCode(TsiAlarmConfigVo.COMM_01);
                 alarm.setAlarmTarget(Long.toString(nodeId));
                 alarm.setAlarmValue(NettyUtils.getRemoteIpAddress(channel));
-                this.tsiCvimDbmsService.add(alarm, (int)Thread.currentThread().getId());
+                this.dbmsProcess.add(alarm, (int)Thread.currentThread().getId());
             }
         }
 

+ 10 - 14
src/main/java/com/tsi/comm/server/tcp/handler/CvimServerInboundMessageHandler.java

@@ -1,8 +1,7 @@
 package com.tsi.comm.server.tcp.handler;
 
-import com.tsi.app.common.app.AppUtils;
 import com.tsi.app.common.xnet.NettyUtils;
-import com.tsi.comm.server.mybatis.TsiDatabaseService;
+import com.tsi.comm.server.config.TsiCvimServerConfig;
 import com.tsi.comm.server.mybatis.vo.AbstractDbmsVo;
 import com.tsi.comm.server.mybatis.vo.AlarmOccrVo;
 import com.tsi.comm.server.mybatis.vo.NodeStatusVo;
@@ -19,23 +18,19 @@ import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.handler.timeout.IdleState;
 import io.netty.handler.timeout.IdleStateEvent;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 @Slf4j
+@RequiredArgsConstructor
 @Component
 @ChannelHandler.Sharable
 public class CvimServerInboundMessageHandler extends ChannelInboundHandlerAdapter {
 
-    private TsiCvimPacketProcess tsiCvimPacketProcess;
-    private TsiDatabaseService tsiNodeService;
-    private TsiCvimDbmsProcess tsiCvimDbmsService;
-
-    public CvimServerInboundMessageHandler() {
-        this.tsiCvimPacketProcess = (TsiCvimPacketProcess)AppUtils.getBean(TsiCvimPacketProcess.class);
-        this.tsiNodeService = (TsiDatabaseService)AppUtils.getBean(TsiDatabaseService.class);
-        this.tsiCvimDbmsService = (TsiCvimDbmsProcess) AppUtils.getBean(TsiCvimDbmsProcess.class);
-    }
+    private final TsiCvimServerConfig config;
+    private final TsiCvimPacketProcess packetProcess;
+    private final TsiCvimDbmsProcess dbmsProcess;
 
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
         //log.error("Handler: channelRead: {}", NettyUtils.getRemoteIpAddress(ctx.channel()));
@@ -65,6 +60,7 @@ public class CvimServerInboundMessageHandler extends ChannelInboundHandlerAdapte
 
             // TODO: session disconnect. to be continue
             NodeStatusVo status = new NodeStatusVo(AbstractDbmsVo.DBMS_NODE_STATUS);
+            status.setServerId(this.config.getServerId());
             status.setNodeId(nodeVo.getNodeId());
             status.setStatus(0);
             status.setIpAddr(NettyUtils.getRemoteIpAddress(ctx.channel()));
@@ -72,9 +68,9 @@ public class CvimServerInboundMessageHandler extends ChannelInboundHandlerAdapte
                 TsiCpuDisconnected packet = new TsiCpuDisconnected(nodeVo.getNodeId(), ctx.channel());
                 packet.setBuf(null);
                 packet.setObj(nodeVo);
-                this.tsiCvimPacketProcess.add(packet, (int)Thread.currentThread().getId());
+                this.packetProcess.add(packet, nodeVo.getIdx());
 
-                this.tsiCvimDbmsService.add(status, (int)Thread.currentThread().getId());
+                this.dbmsProcess.add(status, (int)Thread.currentThread().getId());
             }
             else {
                 log.error("{}.channelInactive: Node {}, Logout but server not running: {}", this.getClass().getSimpleName(), nodeVo.getNodeId(), status.toString());
@@ -107,7 +103,7 @@ public class CvimServerInboundMessageHandler extends ChannelInboundHandlerAdapte
                         alarm.setAlarmCode(TsiAlarmConfigVo.COMM_02);
                         alarm.setAlarmTarget(NettyUtils.getRemoteIpAddress(ctx.channel()));
                         alarm.setAlarmValue(NettyUtils.getRemoteIpAddress(ctx.channel()));
-                        this.tsiCvimDbmsService.add(alarm, (int) Thread.currentThread().getId());
+                        this.dbmsProcess.add(alarm, (int) Thread.currentThread().getId());
                         log.warn("{}.userEventTriggered: Recv Timeout: {}", this.getClass().getSimpleName(), NettyUtils.getRemoteIpAddress(ctx.channel()));
                     }
                     ctx.channel().disconnect();

+ 2 - 0
src/main/java/com/tsi/comm/server/vo/TsiNodeVo.java

@@ -46,6 +46,7 @@ public class TsiNodeVo {
     private byte[] nodePacket = new byte[1];
 
     private boolean dump;
+    private int idx;
 
     public TsiNodeVo(long nodeId, boolean sendTest, boolean sendNode, boolean sendCvim) {
         this.nodeId = nodeId;
@@ -62,6 +63,7 @@ public class TsiNodeVo {
         this.disconnectTm = 0;
         this.lastCommTm = 0;
         this.dump = false;
+        this.idx = 0;
     }
 
     public void initPacket() {

+ 1 - 1
src/main/resources/logback-spring.xml

@@ -24,7 +24,7 @@
     <property name="MAX_HISTORY"  value="30"/>
     <property name="MAX_PROCESS_FILESIZE" value="20MB"/>
     <property name="LOG_PATTERN_FILE"        value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
-    <property name="LOG_PATTERN_ERROR"       value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger{35}.%M.%L - %msg%n"/>
+    <property name="LOG_PATTERN_ERROR"       value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %msg%n"/>
     <property name="LOG_PATTERN_PROCESS"     value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
     <property name="LOG_PATTERN_RAW"         value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
     <property name="LOG_PATTERN_CONSOLE"     value="[%d{HH:mm:ss.SSS}] %highlight([%5level]) %highlight(${PID:-}): %cyan(%msg) %n"/>

+ 23 - 22
src/main/resources/mybatis/mapper/tsi-comm-server.xml

@@ -55,18 +55,19 @@
 
     <insert id="insertNodeStatusInitialize">
     <![CDATA[
-        insert into tb_tsc_node_status(nodeid, status, eventdt)
-        select nodeid, 0, NOW()
+        insert into tb_tsc_node_status(nodeid, status, eventdt, serverid)
+        select nodeid, 0, NOW(), NULL
         from tb_tsc_node
         where nodeid not in (select nodeid from tb_tsc_node_status)
         ]]>
     </insert>
 
-    <update id="updateNodeStatusTerm">
+    <update id="updateNodeStatusTerm" parameterType="java.lang.Integer">
     <![CDATA[
         update tb_tsc_node_status
         set status = 0,
             eventdt = NOW()
+        where serverid = #{serverId}
         ]]>
     </update>
 
@@ -85,12 +86,12 @@
         update tb_tsc_node_status
         set status  = #{stts.status},
             eventdt = NOW(),
-            ipAddr  = #{stts.ipAddr}
+            ipAddr  = #{stts.ipAddr},
+            serverid = #{stts.serverId}
         where nodeid = #{stts.nodeId}
         ]]>
     </update>
 
-
     <insert id="insertKafkaTransHs" parameterType="com.tsi.comm.server.mybatis.vo.KafkaTransVo">
         <![CDATA[
         INSERT INTO tb_tsc_kafka_trans_hs (clct_dt, host_name, status, send_tm, recv_tm)
@@ -109,23 +110,23 @@
         ]]>
     </insert>
 
-    <insert id="insertCommStatus1m">
-    <![CDATA[
-        insert into tb_tsc_node_status(nodeid, status, eventdt)
-        select nodeid, 0, NOW()
-        from tb_tsc_node
-        where nodeid not in (select nodeid from tb_tsc_node_status)
-        ]]>
-    </insert>
-
-    <insert id="insertCommStatus5m">
-    <![CDATA[
-        insert into tb_tsc_node_status(nodeid, status, eventdt)
-        select nodeid, 0, NOW()
-        from tb_tsc_node
-        where nodeid not in (select nodeid from tb_tsc_node_status)
-        ]]>
-    </insert>
+<!--    <insert id="insertCommStatus1m">-->
+<!--    <![CDATA[-->
+<!--        insert into tb_tsc_node_status(nodeid, status, eventdt)-->
+<!--        select nodeid, 0, NOW()-->
+<!--        from tb_tsc_node-->
+<!--        where nodeid not in (select nodeid from tb_tsc_node_status)-->
+<!--        ]]>-->
+<!--    </insert>-->
+
+<!--    <insert id="insertCommStatus5m">-->
+<!--    <![CDATA[-->
+<!--        insert into tb_tsc_node_status(nodeid, status, eventdt)-->
+<!--        select nodeid, 0, NOW()-->
+<!--        from tb_tsc_node-->
+<!--        where nodeid not in (select nodeid from tb_tsc_node_status)-->
+<!--        ]]>-->
+<!--    </insert>-->
 
     <update id="updateProcessStatusStart" parameterType="com.tsi.comm.server.mybatis.vo.ProcessStateVo">
     <![CDATA[

BIN
tsi-comm-server-20240830-0.0.1.jar