hante 1 сар өмнө
parent
commit
36f1cf705f
27 өөрчлөгдсөн 300 нэмэгдсэн , 53 устгасан
  1. 1 0
      conf/ggits-comm-server.pid
  2. 12 1
      conf/ggits-comm-server.yml
  3. 1 1
      conf/ggits-etlp-server.pid
  4. 11 0
      conf/ggits-etlp-server.yml
  5. 11 0
      conf/sig-comm-server.yml
  6. 11 0
      conf/sig-todp-server.yml
  7. 3 0
      ggits-comm-server/src/main/java/com/sig/ggits/comm/server/GgitsCommServerApplication.java
  8. 2 2
      ggits-comm-server/src/main/java/com/sig/ggits/comm/server/cluster/ClusterConfig.java
  9. 6 4
      ggits-comm-server/src/main/java/com/sig/ggits/comm/server/cluster/ClusterMasterService.java
  10. 42 6
      ggits-comm-server/src/main/java/com/sig/ggits/comm/server/controller/GgitsCommServerRestController.java
  11. 2 2
      ggits-comm-server/src/main/resources/application.yml
  12. 3 0
      ggits-etlp-server/src/main/java/com/sig/ggits/etlp/server/GgitsEtlpServerApplication.java
  13. 2 2
      ggits-etlp-server/src/main/java/com/sig/ggits/etlp/server/cluster/ClusterConfig.java
  14. 6 4
      ggits-etlp-server/src/main/java/com/sig/ggits/etlp/server/cluster/ClusterMasterService.java
  15. 41 5
      ggits-etlp-server/src/main/java/com/sig/ggits/etlp/server/controller/GgitsEtlpServerRestController.java
  16. 18 0
      ggits-etlp-server/src/main/resources/application.yml
  17. 4 3
      ggits-tsinfo-server/src/main/java/com/sig/ggits/tsinfo/server/controller/GgitsTsinfoServerController.java
  18. 3 0
      sig-comm-server/src/main/java/com/sig/comm/server/SigCommServerApplication.java
  19. 2 2
      sig-comm-server/src/main/java/com/sig/comm/server/cluster/ClusterConfig.java
  20. 4 3
      sig-comm-server/src/main/java/com/sig/comm/server/cluster/ClusterMasterService.java
  21. 41 5
      sig-comm-server/src/main/java/com/sig/comm/server/controller/SigCommServerRestController.java
  22. 12 2
      sig-comm-server/src/main/resources/application.yml
  23. 3 0
      sig-todp-server/src/main/java/com/sig/todp/server/SigTodpServerApplication.java
  24. 2 2
      sig-todp-server/src/main/java/com/sig/todp/server/cluster/ClusterConfig.java
  25. 6 4
      sig-todp-server/src/main/java/com/sig/todp/server/cluster/ClusterMasterService.java
  26. 40 4
      sig-todp-server/src/main/java/com/sig/todp/server/controller/SigTodpServerRestController.java
  27. 11 1
      sig-todp-server/src/main/resources/application.yml

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

@@ -0,0 +1 @@
+6136

+ 12 - 1
conf/ggits-comm-server.yml

@@ -3,7 +3,7 @@
 
 spring:
   profiles:
-    active: comp
+    active: dev
 server:
   port: 9873
 
@@ -17,3 +17,14 @@ application:
     group-id: ggits-comm-server
     enable-node: false
     enable-sig: true
+
+cluster:
+  enabled: true           # default: false
+  id: 1
+  nodes:
+    - id: 1               # must be 1,2,3,...
+      ip: 192.168.20.44
+      port: 13888
+    - id: 2
+      ip: 192.168.20.45
+      port: 13888

+ 1 - 1
conf/ggits-etlp-server.pid

@@ -1 +1 @@
-5896
+3492

+ 11 - 0
conf/ggits-etlp-server.yml

@@ -15,3 +15,14 @@ application:
     ggits-tsinfo-process-id: 81050
     ggits-tsinfo-url: http://192.168.24.22:9871/info/ps
 
+cluster:
+  enabled: true           # default: false
+  id: 1
+  nodes:
+    - id: 1               # must be 1,2,3,...
+      ip: 192.168.20.44
+      port: 13888
+    - id: 2
+      ip: 192.168.20.45
+      port: 13888
+

+ 11 - 0
conf/sig-comm-server.yml

@@ -12,3 +12,14 @@ application:
     group-id: sig-comm-server
     enable-node: false
     enable-sig: true
+
+cluster:
+  enabled: true           # default: false
+  id: 1
+  nodes:
+    - id: 1               # must be 1,2,3,...
+      ip: 192.168.20.44
+      port: 13888
+    - id: 2
+      ip: 192.168.20.45
+      port: 13888

+ 11 - 0
conf/sig-todp-server.yml

@@ -6,3 +6,14 @@ server:
 
 application:
   process-id: 81020
+
+cluster:
+  enabled: true           # default: false
+  id: 1
+  nodes:
+    - id: 1               # must be 1,2,3,...
+      ip: 192.168.20.44
+      port: 13888
+    - id: 2
+      ip: 192.168.20.45
+      port: 13888

+ 3 - 0
ggits-comm-server/src/main/java/com/sig/ggits/comm/server/GgitsCommServerApplication.java

@@ -72,6 +72,9 @@ public class GgitsCommServerApplication implements CommandLineRunner, Applicatio
                 return;
             }
         }
+        else {
+            clusterConfig.validateClusterInfo();
+        }
 
         ApplicationConfig applicationConfig = SpringUtils.getBean(ApplicationConfig.class);
         applicationConfig.setStartSchedule(false);

+ 2 - 2
ggits-comm-server/src/main/java/com/sig/ggits/comm/server/cluster/ClusterConfig.java

@@ -1,6 +1,6 @@
 package com.sig.ggits.comm.server.cluster;
 
-import com.its.common.cluster.vo.AbstractClusterConfig;
+import com.its.common.cluster.config.AbstractClusterConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@ public class ClusterConfig extends AbstractClusterConfig {
         log.info("[  ClusterConfig]                nodeId: {}", getId());
         log.info("[  ClusterConfig]           syncSeconds: {}", getSyncSeconds());
         log.info("[  ClusterConfig]        ipAddress.port: {}.{}", getIp(), getPort());
-        log.info("[  ClusterConfig]                  node: {} EA.", getNodes().size());
+        log.info("[  ClusterConfig]                  node: {} EA.", getNodes() == null ? 0 : getNodes().size());
         log.info("[  ClusterConfig]                 nodes: {}", getNodes());
     }
 }

+ 6 - 4
ggits-comm-server/src/main/java/com/sig/ggits/comm/server/cluster/ClusterMasterService.java

@@ -1,6 +1,7 @@
 package com.sig.ggits.comm.server.cluster;
 
 import com.its.common.cluster.service.AbstractClusterMasterService;
+import com.its.common.cluster.utils.ClusterUtils;
 import com.its.common.cluster.vo.ClusterMessage;
 import com.its.common.cluster.vo.ClusterMessageData;
 import com.sig.ggits.comm.server.cluster.dto.ClusterGgitsDto;
@@ -22,9 +23,10 @@ public class ClusterMasterService extends AbstractClusterMasterService {
     }
 
     @Override
-    public void election(int clusterId, boolean isMaster) {
-        // 서버 ID, 마스터/슬래이브 여부
-//        log.info("HaClusterMasterService.election: nodeId={}, isMaster={}", nodeId, isMaster);
+    public void election(int clusterId, boolean isMaster, boolean isMasterChanged) {
+        if (isMasterChanged) {
+            log.info("ClusterMasterService:election: master state changed: clusterId: {}, master: {}", clusterId, isMaster);
+        }
     }
 
     @Override
@@ -40,7 +42,7 @@ public class ClusterMasterService extends AbstractClusterMasterService {
         for(ClusterGgitsDto clusterTodpDto : infos){
             if (this.clusterId == clusterTodpDto.getClusterId()) {
                 log.warn("onClusterMessage: clusterId: {}, master: {}, time: {}: clusterId error, this: {}, receive: {}",
-                        message.getClusterId(), message.isMaster(), message.getServerTime(), this.clusterId, clusterTodpDto.getClusterId());
+                        message.getClusterId(), message.isMaster(), ClusterUtils.timeToString(message.getCurrentTimeMillis()), this.clusterId, clusterTodpDto.getClusterId());
             }
         }
     }

+ 42 - 6
ggits-comm-server/src/main/java/com/sig/ggits/comm/server/controller/GgitsCommServerRestController.java

@@ -1,5 +1,7 @@
 package com.sig.ggits.comm.server.controller;
 
+import com.its.common.cluster.vo.ClusterNET;
+import com.its.common.cluster.vo.ClusterNode;
 import com.its.common.utils.TimeUtils;
 import com.sig.ggits.comm.server.cluster.ClusterConfig;
 import com.sig.ggits.comm.server.config.ApplicationConfig;
@@ -17,30 +19,64 @@ import java.util.List;
 
 @RestController
 @RequiredArgsConstructor
-@RequestMapping("/info")
+@RequestMapping("")
 public class GgitsCommServerRestController {
 
     private final ApplicationConfig config;
     private final ClusterConfig clusterConfig;
     private final ApplicationRepository repo;
 
-    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
-    public String info() {
+    @GetMapping(value = "/info", produces = {"application/json; charset=utf8"})
+    public String infoString() {
         String sep = System.lineSeparator();
-        String heading = "----------------------------------------------------------------------------------";
+        String heading = "--------------------------------------------------------------------------------------------------------------------";
 
         StringBuilder sb = new StringBuilder();
+        sb.append(sep);
         sb.append(heading).append(sep);
         sb.append("UTIC GGITS Signal Comm Server").append(sep);
         sb.append(heading).append(sep);
         sb.append(String.format("Process: %s(%s), Booting: %s, Now: %s, Cluster Master: %s",
                 this.config.getProcessId(), this.config.getProcessName(), this.config.getBootingTime(), TimeUtils.now(), this.clusterConfig.isMaster())).append(sep);
         sb.append(heading).append(sep);
+
+        // Cluster running information
+        int ii = 1;
+        if (this.clusterConfig.isEnabled()) {
+            List<Integer> clusterIds = new ArrayList<>(this.clusterConfig.getClusterMap().keySet());
+            Collections.sort(clusterIds);
+
+            sb.append(sep);
+            sb.append(heading).append(sep);
+            sb.append(String.format("Cluster Running Information: clusterNodeId: %d, %d EA", this.clusterConfig.getId(), this.clusterConfig.getClusterMap().size())).append(sep);
+            sb.append(heading).append(sep);
+            sb.append("SEQ nodeId  IP Address       Port     isMaster  masterNet  syncNet  lastSyncRecvTime     lastSyncSendTime").append(sep);
+            sb.append(heading).append(sep);
+
+            for (Integer clusterId : clusterIds) {
+                ClusterNode clusterNode = this.clusterConfig.getClusterMap().get(clusterId);
+                sb.append(String.format("%3d %6.6s  %-15.15s  %-7.7s  %-8.8s  %-9.9s  %-7.7s  %s  %s",
+                        ii++,
+                        this.clusterConfig.getId() == clusterNode.getId() ? "*"+clusterNode.getId() : ""+clusterNode.getId(),
+                        clusterNode.getIp(),
+                        ""+clusterNode.getPort(),
+                        clusterNode.isMaster(),
+                        clusterNode.getElectionState().getState() != ClusterNET.CLOSED ? "Up" : "Down",
+                        clusterNode.getSyncState().getState() != ClusterNET.CLOSED ? "Up" : "Down",
+                        clusterNode.getSyncState().getLastRecvTimeString(),
+                        clusterNode.getSyncState().getLastSendTimeString()
+                )).append(sep);
+            }
+            sb.append(heading).append(sep);
+        }
+
+        sb.append(sep);
+        sb.append(heading).append(sep);
         sb.append("SEQ REGION   Network  LastCommTime         REGION NAME").append(sep);
         sb.append(heading).append(sep);
 
         DecimalFormat dF = new DecimalFormat("#,###");
-        int ii = 1;
+        ii = 1;
         List<Integer> keySet = new ArrayList<>(this.repo.getCenterMap().keySet());
         Collections.sort(keySet);
         for (Integer key : keySet) {
@@ -50,7 +86,7 @@ public class GgitsCommServerRestController {
             }
 
             String commStts = center.isCommOnline() ? "Online" : "Offline";
-            sb.append(String.format("%3d %-6.6s   %-7.7s  %-19.19s  %s",
+            sb.append(String.format("%3d %6.6s   %-7.7s  %-19.19s  %s",
                     ii++,
                     center.getRegionCd(),
                     commStts,

+ 2 - 2
ggits-comm-server/src/main/resources/application.yml

@@ -67,7 +67,7 @@ application:
 spring:
   config:
     activate:
-      on-profile: comp
+      on-profile: dev
   datasource:
     hikari:
       driver-class-name: oracle.jdbc.OracleDriver
@@ -78,7 +78,7 @@ spring:
 spring:
   config:
     activate:
-      on-profile: dev
+      on-profile: prod-test
   datasource:
     hikari:
       driver-class-name: oracle.jdbc.OracleDriver

+ 3 - 0
ggits-etlp-server/src/main/java/com/sig/ggits/etlp/server/GgitsEtlpServerApplication.java

@@ -68,6 +68,9 @@ public class GgitsEtlpServerApplication implements CommandLineRunner, Applicatio
                 return;
             }
         }
+        else {
+            clusterConfig.validateClusterInfo();
+        }
 
         ApplicationConfig applicationConfig = SpringUtils.getBean(ApplicationConfig.class);
         applicationConfig.setStartSchedule(false);

+ 2 - 2
ggits-etlp-server/src/main/java/com/sig/ggits/etlp/server/cluster/ClusterConfig.java

@@ -1,6 +1,6 @@
 package com.sig.ggits.etlp.server.cluster;
 
-import com.its.common.cluster.vo.AbstractClusterConfig;
+import com.its.common.cluster.config.AbstractClusterConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@ public class ClusterConfig extends AbstractClusterConfig {
         log.info("[  ClusterConfig]                nodeId: {}", getId());
         log.info("[  ClusterConfig]           syncSeconds: {}", getSyncSeconds());
         log.info("[  ClusterConfig]        ipAddress.port: {}.{}", getIp(), getPort());
-        log.info("[  ClusterConfig]                  node: {} EA.", getNodes().size());
+        log.info("[  ClusterConfig]                  node: {} EA.", getNodes() == null ? 0 : getNodes().size());
         log.info("[  ClusterConfig]                 nodes: {}", getNodes());
     }
 }

+ 6 - 4
ggits-etlp-server/src/main/java/com/sig/ggits/etlp/server/cluster/ClusterMasterService.java

@@ -1,6 +1,7 @@
 package com.sig.ggits.etlp.server.cluster;
 
 import com.its.common.cluster.service.AbstractClusterMasterService;
+import com.its.common.cluster.utils.ClusterUtils;
 import com.its.common.cluster.vo.ClusterMessage;
 import com.its.common.cluster.vo.ClusterMessageData;
 import com.sig.ggits.etlp.server.cluster.dto.ClusterEtlpDto;
@@ -22,9 +23,10 @@ public class ClusterMasterService extends AbstractClusterMasterService {
     }
 
     @Override
-    public void election(int clusterId, boolean isMaster) {
-        // 서버 ID, 마스터/슬래이브 여부
-//        log.info("HaClusterMasterService.election: nodeId={}, isMaster={}", nodeId, isMaster);
+    public void election(int clusterId, boolean isMaster, boolean isMasterChanged) {
+        if (isMasterChanged) {
+            log.info("ClusterMasterService:election: master state changed: clusterId: {}, master: {}", clusterId, isMaster);
+        }
     }
 
     @Override
@@ -40,7 +42,7 @@ public class ClusterMasterService extends AbstractClusterMasterService {
         for(ClusterEtlpDto clusterTodpDto : infos){
             if (this.clusterId == clusterTodpDto.getClusterId()) {
                 log.warn("onClusterMessage: clusterId: {}, master: {}, time: {}: clusterId error, this: {}, receive: {}",
-                        message.getClusterId(), message.isMaster(), message.getServerTime(), this.clusterId, clusterTodpDto.getClusterId());
+                        message.getClusterId(), message.isMaster(), ClusterUtils.timeToString(message.getCurrentTimeMillis()), this.clusterId, clusterTodpDto.getClusterId());
             }
         }
     }

+ 41 - 5
ggits-etlp-server/src/main/java/com/sig/ggits/etlp/server/controller/GgitsEtlpServerRestController.java

@@ -1,5 +1,7 @@
 package com.sig.ggits.etlp.server.controller;
 
+import com.its.common.cluster.vo.ClusterNET;
+import com.its.common.cluster.vo.ClusterNode;
 import com.its.common.utils.TimeUtils;
 import com.sig.ggits.etlp.server.cluster.ClusterConfig;
 import com.sig.ggits.etlp.server.config.ApplicationConfig;
@@ -17,30 +19,64 @@ import java.util.List;
 
 @RestController
 @RequiredArgsConstructor
-@RequestMapping("/info")
+@RequestMapping("")
 public class GgitsEtlpServerRestController {
 
     private final ApplicationConfig config;
     private final ClusterConfig clusterConfig;
     private final ApplicationRepository repo;
 
-    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
-    public String info() {
+    @GetMapping(value = "/info", produces = {"application/json; charset=utf8"})
+    public String infoString() {
         String sep = System.lineSeparator();
         String heading = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
 
         StringBuilder sb = new StringBuilder();
+        sb.append(sep);
         sb.append(heading).append(sep);
         sb.append("UTIC GGITS Signal ETL Server").append(sep);
         sb.append(heading).append(sep);
         sb.append(String.format("Process: %s(%s), Booting: %s, Now: %s, Cluster Master: %s",
                 this.config.getProcessId(), this.config.getProcessName(), this.config.getBootingTime(), TimeUtils.now(), this.clusterConfig.isMaster())).append(sep);
         sb.append(heading).append(sep);
+
+        // Cluster running information
+        int ii = 1;
+        if (this.clusterConfig.isEnabled()) {
+            List<Integer> clusterIds = new ArrayList<>(this.clusterConfig.getClusterMap().keySet());
+            Collections.sort(clusterIds);
+
+            sb.append(sep);
+            sb.append(heading).append(sep);
+            sb.append(String.format("Cluster Running Information: clusterNodeId: %d, %d EA", this.clusterConfig.getId(), this.clusterConfig.getClusterMap().size())).append(sep);
+            sb.append(heading).append(sep);
+            sb.append("SEQ nodeId  IP Address       Port     isMaster  masterNet  syncNet  lastSyncRecvTime     lastSyncSendTime").append(sep);
+            sb.append(heading).append(sep);
+
+            for (Integer clusterId : clusterIds) {
+                ClusterNode clusterNode = this.clusterConfig.getClusterMap().get(clusterId);
+                sb.append(String.format("%3d %6.6s  %-15.15s  %-7.7s  %-8.8s  %-9.9s  %-7.7s  %s  %s",
+                        ii++,
+                        this.clusterConfig.getId() == clusterNode.getId() ? "*"+clusterNode.getId() : ""+clusterNode.getId(),
+                        clusterNode.getIp(),
+                        ""+clusterNode.getPort(),
+                        clusterNode.isMaster(),
+                        clusterNode.getElectionState().getState() != ClusterNET.CLOSED ? "Up" : "Down",
+                        clusterNode.getSyncState().getState() != ClusterNET.CLOSED ? "Up" : "Down",
+                        clusterNode.getSyncState().getLastRecvTimeString(),
+                        clusterNode.getSyncState().getLastSendTimeString()
+                )).append(sep);
+            }
+            sb.append(heading).append(sep);
+        }
+
+        sb.append(sep);
+        sb.append(heading).append(sep);
         sb.append("SEQ REGION   TB_INT_PHASE            READ     SAVE  TB_INT_OPER_PLAN        READ     SAVE  TB_INT_DY_PLAN          READ     SAVE  TB_INT_RESRV_PLAN       READ     SAVE  TB_INT_SIGNALMAP        READ     SAVE  REGION NAME").append(sep);
         sb.append(heading).append(sep);
 
         DecimalFormat dF = new DecimalFormat("#,###");
-        int ii = 1;
+        ii = 1;
         List<String> keySet = new ArrayList<>(this.repo.getCenterMap().keySet());
         Collections.sort(keySet);
         for (String key : keySet) {
@@ -49,7 +85,7 @@ public class GgitsEtlpServerRestController {
                 continue;
             }
 
-            sb.append(String.format("%3d %-6.6s   %s %8s %8s  %s %8s %8s  %s %8s %8s  %s %8s %8s  %s %8s %8s  %s",
+            sb.append(String.format("%3d %6.6s   %s %8s %8s  %s %8s %8s  %s %8s %8s  %s %8s %8s  %s %8s %8s  %s",
                     ii++,
                     center.getRegionCd(),
                     center.getEtlpFlow().getStartTime(), dF.format(center.getEtlpFlow().getReadCount()), dF.format(center.getEtlpFlow().getWriteCount()),

+ 18 - 0
ggits-etlp-server/src/main/resources/application.yml

@@ -61,6 +61,24 @@ spring:
   config:
     activate:
       on-profile: dev
+  datasource:
+    hikari:
+      sig:
+        driver-class-name: oracle.jdbc.OracleDriver
+        jdbc-url: jdbc:oracle:thin:@115.91.94.42:1521:HANTE
+        username: siguser
+        password: siguser
+      ggits:
+        driver-class-name: oracle.jdbc.OracleDriver
+        jdbc-url: jdbc:oracle:thin:@115.91.94.42:1521:HANTE
+        username: siguser
+        password: siguser
+
+---
+spring:
+  config:
+    activate:
+      on-profile: prod-test
   datasource:
     hikari:
       sig:

+ 4 - 3
ggits-tsinfo-server/src/main/java/com/sig/ggits/tsinfo/server/controller/GgitsTsinfoServerController.java

@@ -18,18 +18,19 @@ import java.util.List;
 
 @RestController
 @RequiredArgsConstructor
-@RequestMapping("/info")
+@RequestMapping("")
 public class GgitsTsinfoServerController {
 
     private final ApplicationConfig config;
     private final ApplicationRepository repo;
 
-    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
-    public String info() {
+    @GetMapping(value = "/info", produces = {"application/json; charset=utf8"})
+    public String infoString() {
         String sep = System.lineSeparator();
         String heading = "---------------------------------------------------------";
 
         StringBuilder sb = new StringBuilder();
+        sb.append(sep);
         sb.append(heading).append(sep);
         sb.append("UTIC GGITS Signal TSINFO Server").append(sep);
         sb.append(heading).append(sep);

+ 3 - 0
sig-comm-server/src/main/java/com/sig/comm/server/SigCommServerApplication.java

@@ -71,6 +71,9 @@ public class SigCommServerApplication implements CommandLineRunner, ApplicationL
                 return;
             }
         }
+        else {
+            clusterConfig.validateClusterInfo();
+        }
 
         ApplicationConfig applicationConfig = SpringUtils.getBean(ApplicationConfig.class);
         applicationConfig.setStartSchedule(false);

+ 2 - 2
sig-comm-server/src/main/java/com/sig/comm/server/cluster/ClusterConfig.java

@@ -1,6 +1,6 @@
 package com.sig.comm.server.cluster;
 
-import com.its.common.cluster.vo.AbstractClusterConfig;
+import com.its.common.cluster.config.AbstractClusterConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@ public class ClusterConfig extends AbstractClusterConfig {
         log.info("[  ClusterConfig]                nodeId: {}", getId());
         log.info("[  ClusterConfig]           syncSeconds: {}", getSyncSeconds());
         log.info("[  ClusterConfig]        ipAddress.port: {}.{}", getIp(), getPort());
-        log.info("[  ClusterConfig]                  node: {} EA.", getNodes().size());
+        log.info("[  ClusterConfig]                  node: {} EA.", getNodes() == null ? 0 : getNodes().size());
         log.info("[  ClusterConfig]                 nodes: {}", getNodes());
     }
 }

+ 4 - 3
sig-comm-server/src/main/java/com/sig/comm/server/cluster/ClusterMasterService.java

@@ -22,9 +22,10 @@ public class ClusterMasterService extends AbstractClusterMasterService {
     }
 
     @Override
-    public void election(int clusterId, boolean isMaster) {
-        // 서버 ID, 마스터/슬래이브 여부
-//        log.info("HaClusterMasterService.election: nodeId={}, isMaster={}", nodeId, isMaster);
+    public void election(int clusterId, boolean isMaster, boolean isMasterChanged) {
+        if (isMasterChanged) {
+            log.info("ClusterMasterService:election: master state changed: clusterId: {}, master: {}", clusterId, isMaster);
+        }
     }
 
     @Override

+ 41 - 5
sig-comm-server/src/main/java/com/sig/comm/server/controller/SigCommServerRestController.java

@@ -1,5 +1,7 @@
 package com.sig.comm.server.controller;
 
+import com.its.common.cluster.vo.ClusterNET;
+import com.its.common.cluster.vo.ClusterNode;
 import com.its.common.utils.TimeUtils;
 import com.sig.comm.server.cluster.ClusterConfig;
 import com.sig.comm.server.config.ApplicationConfig;
@@ -18,21 +20,22 @@ import java.util.List;
 
 @RestController
 @RequiredArgsConstructor
-@RequestMapping("/info")
+@RequestMapping("")
 public class SigCommServerRestController {
 
     private final ApplicationConfig config;
     private final ClusterConfig clusterConfig;
     private final ApplicationRepository repo;
 
-    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
-    public String info() {
+    @GetMapping(value = "/info", produces = {"application/json; charset=utf8"})
+    public String infoString() {
         String sep = System.lineSeparator();
         String heading = "-------------------------------------------------------------------------------------------------------------------------------------";
 
         RegionCenter center = ApplicationRepository.center;
 
         StringBuilder sb = new StringBuilder();
+        sb.append(sep);
         sb.append(heading).append(sep);
         sb.append("UTIC Local Signal Communication Server").append(sep);
         sb.append(heading).append(sep);
@@ -42,11 +45,44 @@ public class SigCommServerRestController {
         sb.append(String.format("%s, %s",
                 center.getRegionCd(), center.getIpAddress())).append(sep);
         sb.append(heading).append(sep);
+
+        // Cluster running information
+        int ii = 1;
+        if (this.clusterConfig.isEnabled()) {
+            List<Integer> clusterIds = new ArrayList<>(this.clusterConfig.getClusterMap().keySet());
+            Collections.sort(clusterIds);
+
+            sb.append(sep);
+            sb.append(heading).append(sep);
+            sb.append(String.format("Cluster Running Information: clusterNodeId: %d, %d EA", this.clusterConfig.getId(), this.clusterConfig.getClusterMap().size())).append(sep);
+            sb.append(heading).append(sep);
+            sb.append("SEQ nodeId  IP Address       Port     isMaster  masterNet  syncNet  lastSyncRecvTime     lastSyncSendTime").append(sep);
+            sb.append(heading).append(sep);
+
+            for (Integer clusterId : clusterIds) {
+                ClusterNode clusterNode = this.clusterConfig.getClusterMap().get(clusterId);
+                sb.append(String.format("%3d %6.6s  %-15.15s  %-7.7s  %-8.8s  %-9.9s  %-7.7s  %s  %s",
+                        ii++,
+                        this.clusterConfig.getId() == clusterNode.getId() ? "*"+clusterNode.getId() : ""+clusterNode.getId(),
+                        clusterNode.getIp(),
+                        ""+clusterNode.getPort(),
+                        clusterNode.isMaster(),
+                        clusterNode.getElectionState().getState() != ClusterNET.CLOSED ? "Up" : "Down",
+                        clusterNode.getSyncState().getState() != ClusterNET.CLOSED ? "Up" : "Down",
+                        clusterNode.getSyncState().getLastRecvTimeString(),
+                        clusterNode.getSyncState().getLastSendTimeString()
+                )).append(sep);
+            }
+            sb.append(heading).append(sep);
+        }
+
+        sb.append(sep);
+        sb.append(heading).append(sep);
         sb.append("SEQ REGION   IP Address      Network  Connect Time         Disconnect Time      Last Comm Time       Connected [TOD]  Center Name").append(sep);
         sb.append(heading).append(sep);
         int total = 0;
         int onLine = 0;
-        int ii = 1;
+        ii = 1;
         List<String> keySet = new ArrayList<>(this.repo.getCenterMap().keySet());
         Collections.sort(keySet);
         DecimalFormat dF = new DecimalFormat("#,###");
@@ -62,7 +98,7 @@ public class SigCommServerRestController {
                 onLine++;
             }
             String tod = region.isSimulateFlag() ? " YES " : " NO  ";
-            sb.append(String.format("%3d %-6.6s   %-15.15s %-8.8s %-20.20s %-20.20s %-20.20s %9s %s  %s",
+            sb.append(String.format("%3d %6.6s   %-15.15s %-8.8s %-20.20s %-20.20s %-20.20s %9s %s  %s",
                     ii++,
                     region.getRegionCd(), region.getIpAddress(), commStatus,
                     region.getNetState().getConnectTimeString(), region.getNetState().getDisconnectTimeString(),

+ 12 - 2
sig-comm-server/src/main/resources/application.yml

@@ -88,11 +88,21 @@ spring:
   datasource:
     hikari:
       driver-class-name: oracle.jdbc.OracleDriver
-#      jdbc-url: jdbc:oracle:thin:@115.91.94.42:1521:HANTE
+      jdbc-url: jdbc:oracle:thin:@115.91.94.42:1521:HANTE
+      username: siguser
+      password: siguser
+---
+spring:
+  config:
+    activate:
+      on-profile: prod-test
+  datasource:
+    hikari:
+      driver-class-name: oracle.jdbc.OracleDriver
+      #      jdbc-url: jdbc:oracle:thin:@115.91.94.42:1521:HANTE
       jdbc-url: jdbc:oracle:thin:@192.168.10.68:1521:CVIBDB
       username: sigtest
       password: sigtest
-
 ---
 spring:
   config:

+ 3 - 0
sig-todp-server/src/main/java/com/sig/todp/server/SigTodpServerApplication.java

@@ -69,6 +69,9 @@ public class SigTodpServerApplication implements CommandLineRunner, ApplicationL
                 return;
             }
         }
+        else {
+            clusterConfig.validateClusterInfo();
+        }
 
         ApplicationConfig applicationConfig = SpringUtils.getBean(ApplicationConfig.class);
         applicationConfig.setStartSchedule(false);

+ 2 - 2
sig-todp-server/src/main/java/com/sig/todp/server/cluster/ClusterConfig.java

@@ -1,6 +1,6 @@
 package com.sig.todp.server.cluster;
 
-import com.its.common.cluster.vo.AbstractClusterConfig;
+import com.its.common.cluster.config.AbstractClusterConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
@@ -23,7 +23,7 @@ public class ClusterConfig extends AbstractClusterConfig {
         log.info("[  ClusterConfig]                nodeId: {}", getId());
         log.info("[  ClusterConfig]           syncSeconds: {}", getSyncSeconds());
         log.info("[  ClusterConfig]        ipAddress.port: {}.{}", getIp(), getPort());
-        log.info("[  ClusterConfig]                  node: {} EA.", getNodes().size());
+        log.info("[  ClusterConfig]                  node: {} EA.", getNodes() == null ? 0 : getNodes().size());
         log.info("[  ClusterConfig]                 nodes: {}", getNodes());
     }
 }

+ 6 - 4
sig-todp-server/src/main/java/com/sig/todp/server/cluster/ClusterMasterService.java

@@ -1,6 +1,7 @@
 package com.sig.todp.server.cluster;
 
 import com.its.common.cluster.service.AbstractClusterMasterService;
+import com.its.common.cluster.utils.ClusterUtils;
 import com.its.common.cluster.vo.ClusterMessage;
 import com.its.common.cluster.vo.ClusterMessageData;
 import com.sig.todp.server.cluster.dto.ClusterTodpDto;
@@ -22,9 +23,10 @@ public class ClusterMasterService extends AbstractClusterMasterService {
     }
 
     @Override
-    public void election(int clusterId, boolean isMaster) {
-        // 서버 ID, 마스터/슬래이브 여부
-//        log.info("HaClusterMasterService.election: nodeId={}, isMaster={}", nodeId, isMaster);
+    public void election(int clusterId, boolean isMaster, boolean isMasterChanged) {
+        if (isMasterChanged) {
+            log.info("ClusterMasterService:election: master state changed: clusterId: {}, master: {}", clusterId, isMaster);
+        }
     }
 
     @Override
@@ -40,7 +42,7 @@ public class ClusterMasterService extends AbstractClusterMasterService {
         for(ClusterTodpDto clusterTodpDto : infos){
             if (this.clusterId == clusterTodpDto.getClusterId()) {
                 log.warn("onClusterMessage: clusterId: {}, master: {}, time: {}: clusterId error, this: {}, receive: {}",
-                        message.getClusterId(), message.isMaster(), message.getServerTime(), this.clusterId, clusterTodpDto.getClusterId());
+                        message.getClusterId(), message.isMaster(), ClusterUtils.timeToString(message.getCurrentTimeMillis()), this.clusterId, clusterTodpDto.getClusterId());
             }
         }
     }

+ 40 - 4
sig-todp-server/src/main/java/com/sig/todp/server/controller/SigTodpServerRestController.java

@@ -1,5 +1,7 @@
 package com.sig.todp.server.controller;
 
+import com.its.common.cluster.vo.ClusterNET;
+import com.its.common.cluster.vo.ClusterNode;
 import com.its.common.utils.TimeUtils;
 import com.sig.todp.server.cluster.ClusterConfig;
 import com.sig.todp.server.config.ApplicationConfig;
@@ -17,30 +19,64 @@ import java.util.List;
 
 @RestController
 @RequiredArgsConstructor
-@RequestMapping("/info")
+@RequestMapping("")
 public class SigTodpServerRestController {
 
     private final ApplicationConfig config;
     private final ClusterConfig clusterConfig;
     private final ApplicationRepository repo;
 
-    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
-    public String info() {
+    @GetMapping(value = "/info", produces = {"application/json; charset=utf8"})
+    public String infoString() {
         String sep = System.lineSeparator();
         String heading = "----------------------------------------------------------------------------";
 
         RegionCenter center = ApplicationRepository.center;
 
         StringBuilder sb = new StringBuilder();
+        sb.append(sep);
         sb.append(heading).append(sep);
         sb.append("UTIC Signal TOD Simulator Server").append(sep);
         sb.append(heading).append(sep);
         sb.append(String.format("Process: %s(%s), Booting: %s, Now: %s, Cluster Master: %s",
                 this.config.getProcessId(), this.config.getProcessName(), this.config.getBootingTime(), TimeUtils.now(), this.clusterConfig.isMaster())).append(sep);
         sb.append(heading).append(sep);
+
+        // Cluster running information
+        int ii = 1;
+        if (this.clusterConfig.isEnabled()) {
+            List<Integer> clusterIds = new ArrayList<>(this.clusterConfig.getClusterMap().keySet());
+            Collections.sort(clusterIds);
+
+            sb.append(sep);
+            sb.append(heading).append(sep);
+            sb.append(String.format("Cluster Running Information: clusterNodeId: %d, %d EA", this.clusterConfig.getId(), this.clusterConfig.getClusterMap().size())).append(sep);
+            sb.append(heading).append(sep);
+            sb.append("SEQ nodeId  IP Address       Port     isMaster  masterNet  syncNet  lastSyncRecvTime     lastSyncSendTime").append(sep);
+            sb.append(heading).append(sep);
+
+            for (Integer clusterId : clusterIds) {
+                ClusterNode clusterNode = this.clusterConfig.getClusterMap().get(clusterId);
+                sb.append(String.format("%3d %6.6s  %-15.15s  %-7.7s  %-8.8s  %-9.9s  %-7.7s  %s  %s",
+                        ii++,
+                        this.clusterConfig.getId() == clusterNode.getId() ? "*"+clusterNode.getId() : ""+clusterNode.getId(),
+                        clusterNode.getIp(),
+                        ""+clusterNode.getPort(),
+                        clusterNode.isMaster(),
+                        clusterNode.getElectionState().getState() != ClusterNET.CLOSED ? "Up" : "Down",
+                        clusterNode.getSyncState().getState() != ClusterNET.CLOSED ? "Up" : "Down",
+                        clusterNode.getSyncState().getLastRecvTimeString(),
+                        clusterNode.getSyncState().getLastSendTimeString()
+                )).append(sep);
+            }
+            sb.append(heading).append(sep);
+        }
+
+        sb.append(sep);
+        sb.append(heading).append(sep);
         sb.append("SEQ REGION   [TOD]  LastTodSimTime        Int(EA) Center Name").append(sep);
         sb.append(heading).append(sep);
-        int ii = 1;
+        ii = 1;
         List<String> keySet = new ArrayList<>(this.repo.getCenterMap().keySet());
         Collections.sort(keySet);
         DecimalFormat dF = new DecimalFormat("#,###");

+ 11 - 1
sig-todp-server/src/main/resources/application.yml

@@ -61,13 +61,23 @@ spring:
   config:
     activate:
       on-profile: dev
+  datasource:
+    hikari:
+      driver-class-name: oracle.jdbc.OracleDriver
+      jdbc-url: jdbc:oracle:thin:@115.91.94.42:1521:HANTE
+      username: siguser
+      password: siguser
+---
+spring:
+  config:
+    activate:
+      on-profile: prod-test
   datasource:
     hikari:
       driver-class-name: oracle.jdbc.OracleDriver
       jdbc-url: jdbc:oracle:thin:@192.168.10.68:1521:CVIBDB
       username: sigtest
       password: sigtest
-
 ---
 spring:
   config: