Эх сурвалжийг харах

ggits-tsinfo-server add send multiples servers

hante 1 сар өмнө
parent
commit
01b622ada0

+ 31 - 0
conf/ggits-tsinfo-server-real.yml

@@ -0,0 +1,31 @@
+application:
+  ggits-server-ip: 192.168.10.66
+  #  server-ip: 192.168.10.66
+  sta-path: /home/ggits/EasyTraffic/sta
+  regions:
+    - region: L03,7603,41190,192.168.10.66,부천시
+    - region: L04,7604,41210,192.168.10.66,광명시
+    - region: L05,7605,41170,192.168.10.66,안양시
+    - region: L06,7606,41290,192.168.10.66,과천시
+    - region: L07,7607,41270,192.168.10.66,안산시
+    - region: L08,7608,41460,192.168.10.66,용인시
+    - region: L09,7609,41130,192.168.10.66,성남시
+    - region: L10,7610,41280,192.168.10.66,고양시
+    - region: L11,7611,41390,192.168.10.66,시흥시
+    - region: L12,7612,41480,192.168.10.66,파주시
+    - region: L13,7613,41630,192.168.10.66,양주시
+    - region: L14,7614,41150,192.168.10.66,의정부시
+    - region: L15,7615,41570,192.168.10.66,김포시
+    - region: L16,7616,41430,192.168.10.66,의왕시
+    - region: L17,7617,41410,192.168.10.66,군포시
+    - region: L19,7619,41110,192.168.10.66,수원시
+    - region: L20,7620,41610,192.168.10.66,광주시
+    - region: L21,7621,41310,192.168.10.66,구리시
+    - region: L22,7622,41450,192.168.10.66,하남시
+    - region: L44,7644,41220,192.168.10.66,평택시
+    - region: L48,7648,41590,192.168.10.66,화성시
+    - region: L56,7656,41550,192.168.10.66,안성시
+    - region: L59,7659,41670,192.168.10.66,여주시
+    - region: L65,7665,41500,192.168.10.66,이천시
+    - region: L69,7669,41800,192.168.10.66,연천시
+    - region: L70,7670,41370,192.168.10.66,오산시

+ 1 - 1
conf/ggits-tsinfo-server-trace.cfg

@@ -1,2 +1,2 @@
-#DUMP=RegionId,...
+#DUMP=7603,...
 DUMP=
 DUMP=

+ 29 - 26
conf/ggits-tsinfo-server.yml

@@ -2,37 +2,40 @@ server:
   port: 9871
   port: 9871
 
 
 application:
 application:
+  process0id: 81050
+  ggits-servers: 192.168.10.66,192.168.10.67
+
 #  server-ip: 192.168.10.66
 #  server-ip: 192.168.10.66
   server-ip: 127.0.0.1
   server-ip: 127.0.0.1
 #  sta-path: /home/ggits/EasyTraffic/sta
 #  sta-path: /home/ggits/EasyTraffic/sta
   sta-path: C:\KoROAD\Z.GGITS\ggits\EasyTraffic\sta
   sta-path: C:\KoROAD\Z.GGITS\ggits\EasyTraffic\sta
   regions:
   regions:
-    - region: L03,7603,41190,192.168.10.66,부천시
-    - region: L04,7604,41210,192.168.10.66,광명시
-    - region: L05,7605,41170,192.168.10.66,안양시
-    - region: L06,7606,41290,192.168.10.66,과천시
-    - region: L07,7607,41270,192.168.10.66,안산시
-    - region: L08,7608,41460,192.168.10.66,용인시
-    - region: L09,7609,41130,192.168.10.66,성남시
-    - region: L10,7610,41280,192.168.10.66,고양시
-    - region: L11,7611,41390,192.168.10.66,시흥시
-    - region: L12,7612,41480,192.168.10.66,파주시
-    - region: L13,7613,41630,192.168.10.66,양주시
-    - region: L14,7614,41150,192.168.10.66,의정부시
-    - region: L15,7615,41570,192.168.10.66,김포시
-    - region: L16,7616,41430,192.168.10.66,의왕시
-    - region: L17,7617,41410,192.168.10.66,군포시
-    - region: L19,7619,41110,192.168.10.66,수원시
-    - region: L20,7620,41610,192.168.10.66,광주시
-    - region: L21,7621,41310,192.168.10.66,구리시
-    - region: L22,7622,41450,192.168.10.66,하남시
-    - region: L44,7644,41220,192.168.10.66,평택시
-    - region: L48,7648,41590,192.168.10.66,화성시
-    - region: L56,7656,41550,192.168.10.66,안성시
-    - region: L59,7659,41670,192.168.10.66,여주시
-    - region: L65,7665,41500,192.168.10.66,이천시
-    - region: L69,7669,41800,192.168.10.66,연천시
-    - region: L70,7670,41370,192.168.10.66,오산시
+    - region: L03,7603,41190,부천시
+    - region: L04,7604,41210,광명시
+    - region: L05,7605,41170,안양시
+    - region: L06,7606,41290,과천시
+    - region: L07,7607,41270,안산시
+    - region: L08,7608,41460,용인시
+    - region: L09,7609,41130,성남시
+    - region: L10,7610,41280,고양시
+    - region: L11,7611,41390,시흥시
+    - region: L12,7612,41480,파주시
+    - region: L13,7613,41630,양주시
+    - region: L14,7614,41150,의정부시
+    - region: L15,7615,41570,김포시
+    - region: L16,7616,41430,의왕시
+    - region: L17,7617,41410,군포시
+    - region: L19,7619,41110,수원시
+    - region: L20,7620,41610,광주시
+    - region: L21,7621,41310,구리시
+    - region: L22,7622,41450,하남시
+    - region: L44,7644,41220,평택시
+    - region: L48,7648,41590,화성시
+    - region: L56,7656,41550,안성시
+    - region: L59,7659,41670,여주시
+    - region: L65,7665,41500,이천시
+    - region: L69,7669,41800,연천시
+    - region: L70,7670,41370,오산시
 
 
 
 
 
 

+ 1 - 1
ggits-tsinfo-server/conf/ggits-tsinfo-server-trace.cfg

@@ -1,2 +1,2 @@
-#DUMP=RegionId,...
+#DUMP=7603,...
 DUMP=
 DUMP=

+ 29 - 28
ggits-tsinfo-server/conf/ggits-tsinfo-server.yml

@@ -1,33 +1,34 @@
 application:
 application:
-#  server-ip: 192.168.10.66
-  server-ip: 127.0.0.1
+  process0id: 81050
+  ggits-servers: 192.168.10.66
+
 #  sta-path: /home/ggits/EasyTraffic/sta
 #  sta-path: /home/ggits/EasyTraffic/sta
   sta-path: C:\KoROAD\Z.GGITS\ggits\EasyTraffic\sta
   sta-path: C:\KoROAD\Z.GGITS\ggits\EasyTraffic\sta
   regions:
   regions:
-    - region: L03,7603,41190,192.168.10.66,부천시
-    - region: L04,7604,41210,192.168.10.66,광명시
-    - region: L05,7605,41170,192.168.10.66,안양시
-    - region: L06,7606,41290,192.168.10.66,과천시
-    - region: L07,7607,41270,192.168.10.66,안산시
-    - region: L08,7608,41460,192.168.10.66,용인시
-    - region: L09,7609,41130,192.168.10.66,성남시
-    - region: L10,7610,41280,192.168.10.66,고양시
-    - region: L11,7611,41390,192.168.10.66,시흥시
-    - region: L12,7612,41480,192.168.10.66,파주시
-    - region: L13,7613,41630,192.168.10.66,양주시
-    - region: L14,7614,41150,192.168.10.66,의정부시
-    - region: L15,7615,41570,192.168.10.66,김포시
-    - region: L16,7616,41430,192.168.10.66,의왕시
-    - region: L17,7617,41410,192.168.10.66,군포시
-    - region: L19,7619,41110,192.168.10.66,수원시
-    - region: L20,7620,41610,192.168.10.66,광주시
-    - region: L21,7621,41310,192.168.10.66,구리시
-    - region: L22,7622,41450,192.168.10.66,하남시
-    - region: L44,7644,41220,192.168.10.66,평택시
-    - region: L48,7648,41590,192.168.10.66,화성시
-    - region: L56,7656,41550,192.168.10.66,안성시
-    - region: L59,7659,41670,192.168.10.66,여주시
-    - region: L65,7665,41500,192.168.10.66,이천시
-    - region: L69,7669,41800,192.168.10.66,연천시
-    - region: L70,7670,41370,192.168.10.66,오산시
+    - region: L03,7603,41190,부천시
+    - region: L04,7604,41210,광명시
+    - region: L05,7605,41170,안양시
+    - region: L06,7606,41290,과천시
+    - region: L07,7607,41270,안산시
+    - region: L08,7608,41460,용인시
+    - region: L09,7609,41130,성남시
+    - region: L10,7610,41280,고양시
+    - region: L11,7611,41390,시흥시
+    - region: L12,7612,41480,파주시
+    - region: L13,7613,41630,양주시
+    - region: L14,7614,41150,의정부시
+    - region: L15,7615,41570,김포시
+    - region: L16,7616,41430,의왕시
+    - region: L17,7617,41410,군포시
+    - region: L19,7619,41110,수원시
+    - region: L20,7620,41610,광주시
+    - region: L21,7621,41310,구리시
+    - region: L22,7622,41450,하남시
+    - region: L44,7644,41220,평택시
+    - region: L48,7648,41590,화성시
+    - region: L56,7656,41550,안성시
+    - region: L59,7659,41670,여주시
+    - region: L65,7665,41500,이천시
+    - region: L69,7669,41800,연천시
+    - region: L70,7670,41370,오산시
 
 

+ 26 - 9
ggits-tsinfo-server/src/main/java/com/sig/ggits/tsinfo/server/config/ApplicationConfig.java

@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component;
 
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PostConstruct;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotBlank;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
 @Slf4j
 @Slf4j
@@ -20,10 +21,12 @@ import java.util.List;
 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
 public class ApplicationConfig {
 public class ApplicationConfig {
 
 
-    @NotBlank
-    private String serverIp = "192.168.10.66";
     private String processId = "81050";
     private String processId = "81050";
-    private int serverPort = 8900;
+
+    @NotBlank
+    private String ggitsServers;// = "192.168.10.66";
+//    private int serverPort = 8900;
+
     private int connectTimeout = 5;
     private int connectTimeout = 5;
     private int readerIdleTime = 0;
     private int readerIdleTime = 0;
     private int writerIdleTime = 0;
     private int writerIdleTime = 0;
@@ -39,6 +42,7 @@ public class ApplicationConfig {
     @NotBlank
     @NotBlank
     private List<RegionInfo> regions;
     private List<RegionInfo> regions;
 
 
+    private List<String> commServerIps;
 
 
     @Getter
     @Getter
     @Setter
     @Setter
@@ -46,8 +50,9 @@ public class ApplicationConfig {
     @AllArgsConstructor
     @AllArgsConstructor
     @NoArgsConstructor
     @NoArgsConstructor
     public static class RegionInfo {
     public static class RegionInfo {
-        private String region;
+        private String region;          // application.yml 에서 읽어오는 정보, regionCd,regionId,ggitsRegionNo,regionNm
 
 
+        // region 정보를 통해 획득하는 정보
         private String regionCd;        /* 지역 코드 */
         private String regionCd;        /* 지역 코드 */
         private int regionId;           /* 지역 ID */
         private int regionId;           /* 지역 ID */
         private int ggitsRegionNo;      /* 경기도 지역 번호 */
         private int ggitsRegionNo;      /* 경기도 지역 번호 */
@@ -56,17 +61,17 @@ public class ApplicationConfig {
 
 
         public GgitsRegion toDto() {
         public GgitsRegion toDto() {
             String[] data = this.region.split(",");
             String[] data = this.region.split(",");
-            if (data.length != 5) {
+            if (data.length != 4) {
                 log.error("Parameter count error: {}, {}", data.length, this.region);
                 log.error("Parameter count error: {}, {}", data.length, this.region);
                 return null;
                 return null;
             }
             }
             this.regionCd = data[0].trim();
             this.regionCd = data[0].trim();
             this.regionId = Integer.parseInt(data[1].trim());
             this.regionId = Integer.parseInt(data[1].trim());
             this.ggitsRegionNo = Integer.parseInt(data[2].trim());
             this.ggitsRegionNo = Integer.parseInt(data[2].trim());
-            this.serverIp = data[3].trim();
-            this.regionNm = data[4].trim();
+            this.regionNm = data[3].trim();
 
 
-            return new GgitsRegion(this.ggitsRegionNo, this.regionCd.trim(), this.regionId, this.serverIp, this.regionId, this.regionNm);
+            // regionId ==> comm udp port
+            return new GgitsRegion(this.ggitsRegionNo, this.regionCd.trim(), this.regionId, this.regionNm, this.regionId);
         }
         }
     }
     }
 
 
@@ -81,7 +86,19 @@ public class ApplicationConfig {
         if (this.retrySeconds < 10) {
         if (this.retrySeconds < 10) {
             this.retrySeconds = 10;
             this.retrySeconds = 10;
         }
         }
-        log.info("{}", this.regions);
+        loadGgitsCommServers();
+
+        log.info("Regions: {}", this.regions);
+        log.info("GgitsServers: {}", this.commServerIps);
+    }
+
+    private void loadGgitsCommServers() {
+        this.commServerIps = new ArrayList<>();
+
+        String[] data = this.ggitsServers.split(",");
+        for (String serverIp : data) {
+            this.commServerIps.add(serverIp.trim());
+        }
     }
     }
 
 
 }
 }

+ 2 - 0
ggits-tsinfo-server/src/main/java/com/sig/ggits/tsinfo/server/controller/GgitsTsinfoServerController.java

@@ -35,6 +35,8 @@ public class GgitsTsinfoServerController {
         sb.append(heading).append(sep);
         sb.append(heading).append(sep);
         sb.append(String.format("Process Id: %s, %s, %s", this.config.getProcessId(), this.config.getBootingTime(), TimeUtils.now())).append(sep);
         sb.append(String.format("Process Id: %s, %s, %s", this.config.getProcessId(), this.config.getBootingTime(), TimeUtils.now())).append(sep);
         sb.append(heading).append(sep);
         sb.append(heading).append(sep);
+        sb.append(String.format("GGITS Comm Server: %s", this.config.getGgitsServers()));
+        sb.append(heading).append(sep);
         sb.append("SEQ REGION   Network  LastCommTime         REGION NAME").append(sep);
         sb.append("SEQ REGION   Network  LastCommTime         REGION NAME").append(sep);
 //        sb.append("SEQ REGION   Network  LastCommTime         SEQ").append(sep);
 //        sb.append("SEQ REGION   Network  LastCommTime         SEQ").append(sep);
         sb.append(heading).append(sep);
         sb.append(heading).append(sep);

+ 3 - 5
ggits-tsinfo-server/src/main/java/com/sig/ggits/tsinfo/server/dto/GgitsRegion.java

@@ -22,9 +22,8 @@ public class GgitsRegion implements Serializable {
     private int ggitsRegionNo;        /* 경기도 지역 번호 */
     private int ggitsRegionNo;        /* 경기도 지역 번호 */
     private String regionCd;        /* 지역 코드 */
     private String regionCd;        /* 지역 코드 */
     private int regionId;
     private int regionId;
-    private String serverIp;
-    private int serverPort;
     private String regionNm;
     private String regionNm;
+    private int commPort;
 
 
     private boolean isCommOnline;
     private boolean isCommOnline;
     private long lastCommMilliSeconds;
     private long lastCommMilliSeconds;
@@ -33,13 +32,12 @@ public class GgitsRegion implements Serializable {
     private String logKey;
     private String logKey;
     private long sendSeq;
     private long sendSeq;
 
 
-    public GgitsRegion(int ggitsRegionNo, String regionCd, int regionId, String serverIp, int serverPort, String regionNm) {
+    public GgitsRegion(int ggitsRegionNo, String regionCd, int regionId, String regionNm, int serverPort) {
         this.ggitsRegionNo = ggitsRegionNo;
         this.ggitsRegionNo = ggitsRegionNo;
         this.regionCd = regionCd;
         this.regionCd = regionCd;
         this.regionId = regionId;
         this.regionId = regionId;
-        this.serverIp = serverIp;
-        this.serverPort = serverPort;
         this.regionNm = regionNm;
         this.regionNm = regionNm;
+        this.commPort = serverPort;
 
 
         //this.logKey = String.valueOf(this.ggitsRegionNo);
         //this.logKey = String.valueOf(this.ggitsRegionNo);
         this.logKey = String.valueOf(this.regionCd);
         this.logKey = String.valueOf(this.regionCd);

+ 21 - 0
ggits-tsinfo-server/src/main/java/com/sig/ggits/tsinfo/server/dto/UdpServerInfo.java

@@ -0,0 +1,21 @@
+package com.sig.ggits.tsinfo.server.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class UdpServerInfo {
+
+    private String serverIp;
+    private int port;
+
+    private DatagramSocket datagramSocket;
+    private InetAddress ipAddress;
+
+}

+ 1 - 1
ggits-tsinfo-server/src/main/java/com/sig/ggits/tsinfo/server/service/TsinfoFileWatcherService.java

@@ -48,7 +48,7 @@ public class TsinfoFileWatcherService {
                 continue;
                 continue;
             }
             }
             try {
             try {
-                TsinfoFileWorker tsinfoFileWorker = new TsinfoFileWorker(center, String.valueOf(center.getGgitsRegionNo()), centerDirectory);
+                TsinfoFileWorker tsinfoFileWorker = new TsinfoFileWorker(center, String.valueOf(center.getGgitsRegionNo()), centerDirectory, this.config.getCommServerIps());
                 this.workerList.add(tsinfoFileWorker);
                 this.workerList.add(tsinfoFileWorker);
                 Thread worker = new Thread(this.workerGroup, tsinfoFileWorker);
                 Thread worker = new Thread(this.workerGroup, tsinfoFileWorker);
                 worker.setName(String.format("TsinfoFileWatcher-%02d", idx++));
                 worker.setName(String.format("TsinfoFileWatcher-%02d", idx++));

+ 35 - 22
ggits-tsinfo-server/src/main/java/com/sig/ggits/tsinfo/server/service/worker/TsinfoFileWorker.java

@@ -3,6 +3,7 @@ package com.sig.ggits.tsinfo.server.service.worker;
 import com.its.common.utils.SysUtils;
 import com.its.common.utils.SysUtils;
 import com.sig.common.protocol.SigProtocolConst;
 import com.sig.common.protocol.SigProtocolConst;
 import com.sig.ggits.tsinfo.server.dto.GgitsRegion;
 import com.sig.ggits.tsinfo.server.dto.GgitsRegion;
+import com.sig.ggits.tsinfo.server.dto.UdpServerInfo;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.buffer.Unpooled;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -13,12 +14,10 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.IOException;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.SocketException;
-import java.net.UnknownHostException;
+import java.net.*;
 import java.nio.file.*;
 import java.nio.file.*;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 
@@ -31,16 +30,17 @@ public class TsinfoFileWorker implements Runnable, AutoCloseable {
     private final String filePath;  // 지역 번호
     private final String filePath;  // 지역 번호
     private final String absolutePath; // 파일 절대 경로
     private final String absolutePath; // 파일 절대 경로
     private final AtomicBoolean running = new AtomicBoolean(false);
     private final AtomicBoolean running = new AtomicBoolean(false);
-    private InetAddress serverAddress;
-    private DatagramSocket datagramSocket;
+    private final List<String> ggitsUdpServers;
+    private final List<UdpServerInfo> ggitsUdpSocketServers = new ArrayList<>();
     private int packetSeq = 0;
     private int packetSeq = 0;
     private int sendLcNoCnt = 0;
     private int sendLcNoCnt = 0;
 
 
-    public TsinfoFileWorker(GgitsRegion center, String filePath, String absoluteFilePath) throws IOException {
+    public TsinfoFileWorker(GgitsRegion center, String filePath, String absoluteFilePath, List<String> ggitsUdpServers) throws IOException {
         this.service = FileSystems.getDefault().newWatchService();
         this.service = FileSystems.getDefault().newWatchService();
         this.center = center;
         this.center = center;
         this.filePath = filePath;
         this.filePath = filePath;
         this.absolutePath = absoluteFilePath;
         this.absolutePath = absoluteFilePath;
+        this.ggitsUdpServers = ggitsUdpServers;
 
 
         Path watchPath = FileSystems.getDefault().getPath(absoluteFilePath);
         Path watchPath = FileSystems.getDefault().getPath(absoluteFilePath);
         watchPath.register(this.service,
         watchPath.register(this.service,
@@ -50,16 +50,21 @@ public class TsinfoFileWorker implements Runnable, AutoCloseable {
 
 
     private boolean initUdpChannel() {
     private boolean initUdpChannel() {
         try {
         try {
-            this.datagramSocket = new DatagramSocket();
-            try {
-                this.serverAddress = InetAddress.getByName(this.center.getServerIp());
-            }
-            catch (UnknownHostException e) {
-                log.error("{}", e.getMessage());
-                return false;
+            for (String serverIp : this.ggitsUdpServers) {
+                UdpServerInfo server = new UdpServerInfo();
+                server.setServerIp(serverIp);
+                server.setPort(this.center.getCommPort());
+                server.setDatagramSocket(new DatagramSocket());
+                try {
+                    server.setIpAddress(InetAddress.getByName(serverIp));
+                    server.getDatagramSocket().connect(server.getIpAddress(), this.center.getCommPort());
+                    this.ggitsUdpSocketServers.add(server);
+                } catch (UnknownHostException e) {
+                    log.error("{}: {}", server, e.getMessage());
+                    return false;
+                }
             }
             }
-            this.datagramSocket.connect(this.serverAddress, this.center.getServerPort());
-        } catch (SocketException e) {
+        } catch(SocketException e){
             log.error("{}", e.getMessage());
             log.error("{}", e.getMessage());
             return false;
             return false;
         }
         }
@@ -194,7 +199,7 @@ public class TsinfoFileWorker implements Runnable, AutoCloseable {
             while ((bytesRead = fileInputStream.read(buffer)) != -1) {
             while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                 // 데이터 길이 계산 (2바이트)
                 // 데이터 길이 계산 (2바이트)
                 short dataLength = (short) bytesRead;
                 short dataLength = (short) bytesRead;
-                short count = (short)(dataLength / 10);
+                short count = (short) (dataLength / 10);
                 this.sendLcNoCnt += count;
                 this.sendLcNoCnt += count;
                 this.packetSeq++;
                 this.packetSeq++;
 
 
@@ -219,7 +224,7 @@ public class TsinfoFileWorker implements Runnable, AutoCloseable {
 
 
                 // Packet Frame Tail
                 // Packet Frame Tail
                 ByteBuf tail = Unpooled.buffer(2);
                 ByteBuf tail = Unpooled.buffer(2);
-                tail.writeByte((byte)0x00);
+                tail.writeByte((byte) 0x00);
                 tail.writeByte(SigProtocolConst.SIG_ETX);
                 tail.writeByte(SigProtocolConst.SIG_ETX);
 
 
                 // Packet Frame (Head + Data + Tail)
                 // Packet Frame (Head + Data + Tail)
@@ -229,8 +234,16 @@ public class TsinfoFileWorker implements Runnable, AutoCloseable {
                 int length = packet.readableBytes();
                 int length = packet.readableBytes();
                 byte[] bytes = new byte[length];
                 byte[] bytes = new byte[length];
                 packet.getBytes(packet.readerIndex(), bytes);
                 packet.getBytes(packet.readerIndex(), bytes);
-                java.net.DatagramPacket sendPacket = new java.net.DatagramPacket(bytes, bytes.length, this.serverAddress, this.center.getServerPort());
-                this.datagramSocket.send(sendPacket);
+
+                // 등록된 통신서버 모두에 차례로 전송
+                for (UdpServerInfo udpServer : this.ggitsUdpSocketServers) {
+                    try {
+                        DatagramPacket sendPacket = new DatagramPacket(bytes, bytes.length, udpServer.getIpAddress(), this.center.getCommPort());
+                        udpServer.getDatagramSocket().send(sendPacket);
+                    } catch (IOException e) {
+                        log.error("Send Error: {}.{}: IOException: {}", udpServer.getServerIp(), udpServer.getPort(), e.getMessage());
+                    }
+                }
                 if (this.center.isDump()) {
                 if (this.center.isDump()) {
                     //log.info("Packet Frame Sent: Data {} EA, Total {} Bytes.", count, length);
                     //log.info("Packet Frame Sent: Data {} EA, Total {} Bytes.", count, length);
                     log.info("SEND: [{}]. {} Bytes. {}", center.getLogKey(), bytes.length, SysUtils.byteArrayToHex(bytes));
                     log.info("SEND: [{}]. {} Bytes. {}", center.getLogKey(), bytes.length, SysUtils.byteArrayToHex(bytes));
@@ -239,11 +252,11 @@ public class TsinfoFileWorker implements Runnable, AutoCloseable {
             }
             }
         }
         }
         catch (FileNotFoundException e) {
         catch (FileNotFoundException e) {
-            log.warn("{}, {}, {}, File Not Found. {}", this.center.getRegionCd(), this.filePath, absoluteFilePath, e.getMessage());
+            log.error("{}, {}, {}, File Not Found. {}", this.center.getRegionCd(), this.filePath, absoluteFilePath, e.getMessage());
             return -1;
             return -1;
         }
         }
         catch (IOException e) {
         catch (IOException e) {
-            log.warn("{}, {}, {}, IOException: {}", this.center.getRegionCd(), this.filePath, absoluteFilePath, e.getMessage());
+            log.error("{}, {}, {}, IOException: {}", this.center.getRegionCd(), this.filePath, absoluteFilePath, e.getMessage());
             return calDataCount;
             return calDataCount;
         }
         }
         return calDataCount;
         return calDataCount;