Browse Source

application.yml update, spring.config.import.prod

shjung 3 tuần trước cách đây
mục cha
commit
2f2a0fb138

+ 10 - 4
conf/tsi-comm-server.yml

@@ -1,11 +1,11 @@
-spring:
-  profiles:
-    active: dev
+#spring:
+#  profiles:
+#    active: dev
   #main:
   #  web-application-type: servlet
 
 application:
-  process-id: tsi-comm-server
+  process-id: tsi-comm-server-1
   cvim-server:
     server-id: 0
     check-packet: false
@@ -15,3 +15,9 @@ application:
 logging:
   file:
     path: ${user.dir}/logs/tsi-comm-server/
+
+#spring:
+#  datasource:
+#    hikari:
+#      #jdbc-url: jdbc:mariadb://10.4.4.20:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
+#      jdbc-url: jdbc:mariadb:failover://10.4.4.20:4006,10.4.4.21:4006/cvim_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul&connectTimeout=3000&socketTimeout=6000&failoverEnable=true&failoverReadOnly=false

+ 1 - 1
conn.sh

@@ -36,13 +36,13 @@ dependencies {
     // lombok 라이브러리 추가 끝
 
     implementation 'org.springframework.boot:spring-boot-starter-web'
-    implementation 'org.springframework.boot:spring-boot-starter-actuator'
     implementation 'org.springframework.boot:spring-boot-starter-aop'
     implementation 'org.springframework.boot:spring-boot-starter-jdbc'
     implementation 'org.springframework.boot:spring-boot-starter-tomcat'
 
     implementation 'org.springframework.boot:spring-boot-configuration-processor'
 
+    implementation 'org.springframework.boot:spring-boot-starter-actuator'
     implementation 'io.micrometer:micrometer-registry-prometheus'
 
     implementation 'org.springframework.kafka:spring-kafka'

+ 56 - 22
tsi-comm-server/src/main/java/com/tsi/comm/server/TsiCommServerApplication.java

@@ -1,5 +1,6 @@
 package com.tsi.comm.server;
 
+import com.tsi.comm.server.config.ApplicationConfig;
 import com.tsi.comm.server.config.TsiCvimServerConfig;
 import com.tsi.comm.server.kafka.KafkaConsumerService;
 import com.tsi.comm.server.kafka.KafkaProducerService;
@@ -14,6 +15,7 @@ import com.tsi.comm.server.repository.TsiSessionManager;
 import com.tsi.comm.server.tcp.TsiCvimServer;
 import com.tsi.comm.server.vo.TsiAlarmConfigVo;
 import com.tsi.common.spring.SpringUtils;
+import com.tsi.common.utils.ApplicationUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -28,6 +30,9 @@ import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.event.ContextClosedEvent;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
@@ -65,6 +70,9 @@ public class TsiCommServerApplication implements CommandLineRunner, ApplicationL
         log.info("** startup: {}", sdfDate.format(new Date()));
         log.info("************************************************************************************");
 
+        ApplicationConfig applicationConfig = SpringUtils.getBean(ApplicationConfig.class);
+        applicationConfig.setStartSchedule(false);
+
         TsiCvimServerConfig config = SpringUtils.getBean(TsiCvimServerConfig.class);
 
         applicationName = APPLICATION_NAME + "-" + config.getServerId();
@@ -109,70 +117,96 @@ public class TsiCommServerApplication implements CommandLineRunner, ApplicationL
         catch(Exception e) {
             // no logging
         }
+
+        applicationConfig.setStartSchedule(true);
+
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            log.error("on shutdown hook.");
+            applicationConfig.setStartSchedule(false);
+            terminate();
+        }));
     }
 
-    @Override
-    public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
+    public void terminate() {
         SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
+        log.error("************************************************************************************");
+        log.error("**    Application Terminated: {}", sdfDate.format(new Date()));
         int serverId = 0;
         try {
             TsiCvimServerConfig config = SpringUtils.getBean(TsiCvimServerConfig.class);
+            if (config != null) {
             config.setStartup(false);
             serverId = config.getServerId();
+            }
         } catch (Exception e) {
-            // no logging
+            log.error("**    Application.terminate:config: {}", e.getMessage());
         }
 
         try {
             TsiSessionManager sessionManager = SpringUtils.getBean(TsiSessionManager.class);
-            sessionManager.stop();
+            if (sessionManager != null) {
+                sessionManager.stop();
+            }
         } catch (Exception e) {
-            // no logging
+            log.error("**    Application.terminate:sessionManager: {}", e.getMessage());
         }
 
         try {
             TsiCvimServer cvimServer = SpringUtils.getBean(TsiCvimServer.class);
-            cvimServer.stop();
+            if (cvimServer != null) {
+                cvimServer.stop();
+            }
         } catch (Exception e) {
-            // no logging
+            log.error("**    Application.terminate:cvimServer: {}", e.getMessage());
         }
 
         try {
             KafkaProducerService kafkaProducerService = SpringUtils.getBean(KafkaProducerService.class);
-            kafkaProducerService.shutdown();
+            if (kafkaProducerService != null) {
+                kafkaProducerService.shutdown();
+            }
         } catch (Exception e) {
-            // no logging
+            log.error("**    Application.terminate:kafkaProducerService: {}", e.getMessage());
         }
 
         try {
             KafkaConsumerService kafkaConsumerService = SpringUtils.getBean(KafkaConsumerService.class);
-            kafkaConsumerService.shutdown();
+            if (kafkaConsumerService != null) {
+                kafkaConsumerService.shutdown();
+            }
         } catch (Exception e) {
-            // no logging
+            log.error("**    Application.terminate:kafkaConsumerService: {}", e.getMessage());
         }
 
         try {
             TsiCommServerService tsiCommServerService = SpringUtils.getBean(TsiCommServerService.class);
             // 노드 통신상태 Off 초기화
-            tsiCommServerService.updateNodeStatusTerm(serverId);
-
-            // 시스템 종료 알람 이력 저장
-            AlarmOccrVo alarm = new AlarmOccrVo(AbstractDbmsVo.DBMS_ALARM_OCCR_HS);
-            alarm.setAlarmCode(TsiAlarmConfigVo.SYS_00);
-            alarm.setAlarmTarget(applicationName);
-            alarm.setAlarmValue("Terminated");
-            tsiCommServerService.insertAlarmOccrHs(alarm);
-            tsiCommServerService.updateProcessState(2);
+            if (tsiCommServerService != null) {
+                tsiCommServerService.updateNodeStatusTerm(serverId);
+                // 시스템 종료 알람 이력 저장
+                AlarmOccrVo alarm = new AlarmOccrVo(AbstractDbmsVo.DBMS_ALARM_OCCR_HS);
+                alarm.setAlarmCode(TsiAlarmConfigVo.SYS_00);
+                alarm.setAlarmTarget(applicationName);
+                alarm.setAlarmValue("Terminated");
+                tsiCommServerService.insertAlarmOccrHs(alarm);
+                tsiCommServerService.updateProcessState(2);
+            }
         } catch (Exception e) {
-            // no logging
+            log.error("**    Application.terminate:updateProcessState: {}", e.getMessage());
         }
+        log.error("************************************************************************************");
+    }
 
-        log.error("Application Terminated: {}, {}", sdfDate.format(new Date()), contextClosedEvent.toString());
+    @Override
+    public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
+        log.error("{}", contextClosedEvent);
+        terminate();
     }
 
     @Override
     public void destroy() throws Exception {
+        log.error("Application destroy.");
     }
 
     @Override

+ 5 - 0
tsi-comm-server/src/main/java/com/tsi/comm/server/config/DatabaseConfig.java

@@ -1,6 +1,7 @@
 package com.tsi.comm.server.config;
 
 import com.zaxxer.hikari.HikariDataSource;
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -23,6 +24,7 @@ import javax.annotation.PostConstruct;
 import javax.sql.DataSource;
 
 @Slf4j
+@Getter
 @RequiredArgsConstructor
 @Configuration
 @EnableTransactionManagement
@@ -32,12 +34,15 @@ public class DatabaseConfig {
 
     @Value("${spring.datasource.hikari.mapper-locations:classpath:mybatis/mapper/**/*.xml}")
     String mapperLocations;
+    @Value("${spring.datasource.hikari.jdbc-url}")
+    String jdbcUrl;
 
     @PostConstruct
     private void init() {
         if (this.mapperLocations.trim().isEmpty()) {
             this.mapperLocations = "classpath:mybatis/mapper/**/*.xml";
         }
+        log.info("        jdbcUrl: {}", this.jdbcUrl);
         log.info("mapperLocations-tsi: {}", this.mapperLocations);
     }
 

+ 96 - 0
tsi-comm-server/src/main/java/com/tsi/comm/server/controller/TsiCommServerRestController.java

@@ -0,0 +1,96 @@
+package com.tsi.comm.server.controller;
+
+import com.tsi.comm.server.config.ApplicationConfig;
+import com.tsi.comm.server.config.DatabaseConfig;
+import com.tsi.comm.server.config.TsiCvimServerConfig;
+import com.tsi.comm.server.repository.ApplicationRepository;
+import com.tsi.comm.server.repository.TsiNodeManager;
+import com.tsi.comm.server.vo.TsiNodeVo;
+import com.tsi.comm.server.xnet.NettyUtils;
+import com.tsi.common.utils.TimeUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("")
+public class TsiCommServerRestController {
+
+    private final ApplicationConfig config;
+    private final DatabaseConfig databaseConfig;
+    private final TsiCvimServerConfig serverConfig;
+    private final TsiNodeManager nodeManager;
+
+    @GetMapping(value = "/info", produces = {"application/json; charset=utf8"})
+    public String info() {
+        String sep = System.lineSeparator();
+        String heading = "--------------------------------------------------------------------------------------------------------------------------------";
+
+        StringBuilder sb = new StringBuilder();
+        sb.append(heading).append(sep);
+        sb.append(" UTIC TSI Wireless Communication Server").append(sep);
+        sb.append(String.format(" Process Id: %s, Server Id: %d, Binding: %d, %s, %s",
+                this.config.getProcessId(), this.serverConfig.getServerId(), this.serverConfig.getBindingPort(),
+                this.config.getBootingTime(), TimeUtils.now())).append(sep);
+        sb.append(heading).append(sep);
+//        sb.append(String.format(" %s", this.databaseConfig.getJdbcUrl())).append(sep);
+//        sb.append(heading).append(sep);
+
+        int nodeCount = this.nodeManager.getTsiNodeVoMap().size();
+        sb.append(String.format(" Report Node Sessions: %d Nodes. INTC(Install/SendNode/SendTest/SendCvim)", nodeCount)).append(sep);
+
+        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"));
+
+        sb.append(String.format(" %10s %4s %7s %19s %19s %9s %6s %19s  Remote-Address", "Node ID", "INTC", "Connect", "Connect Time", "Disconnect Time", "Connected", "Closed", "Last-Recv-Time")).append(sep);
+        sb.append(heading).append(sep);
+
+        for (Map.Entry<Long, TsiNodeVo> obj : this.nodeManager.getTsiNodeVoMap().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()));
+
+            sb.append(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)).append(sep);
+        }
+
+        sb.append(heading).append(sep);
+        sb.append(String.format(" Total Nodes: %d EA, Registered: %d EA, Unknown: %d EA, Connected: %d EA", nodeCount, registered, unknown, connected)).append(sep);
+        sb.append(heading).append(sep);
+        return sb.toString();
+    }
+
+
+}

+ 0 - 1
tsi-comm-server/src/main/java/com/tsi/comm/server/xnet/NettyTcpServer.java

@@ -70,7 +70,6 @@ public abstract class NettyTcpServer {
         }
         catch (InterruptedException e) {
             log.error("{}", e.toString());
-            e.printStackTrace();
         }
     }
 }

+ 8 - 7
tsi-comm-server/src/main/resources/application.yml

@@ -3,11 +3,11 @@ spring:
     name: tsi-comm-server
   profiles:
     active: prod
-  config:
-    import:
-      - optional:file:${user.dir}/conf/tsi-comm-server.yml
-  main:
-    web-application-type: none
+#  config:
+#    import:
+#      - optional:file:${user.dir}/conf/tsi-comm-server.yml
+#  main:
+#    web-application-type: none
 
   datasource:
     hikari:
@@ -111,10 +111,11 @@ spring:
     activate:
       on-profile: prod
     import:
-      - optional:file:${user.dir}/conf/tsi-comm-server-prod.yml
+      - optional:file:${user.dir}/conf/tsi-comm-server.yml
   datasource:
     hikari:
-      jdbc-url: jdbc:mariadb://10.4.4.20:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
+      #jdbc-url: jdbc:mariadb://10.4.4.20:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
+      jdbc-url: jdbc:mariadb:failover://10.4.4.20:4006,10.4.4.21:4006/cvim_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul&connectTimeout=3000&socketTimeout=6000&failoverEnable=true&failoverReadOnly=false
 
   data:
     mongodb: