Browse Source

cluster update

shjung 2 days ago
parent
commit
2207dfb5e8

+ 0 - 1
moct-utic-server/src/main/java/com/utic/its/moct/utic/server/service/MoctUticServerService.java

@@ -69,7 +69,6 @@ public class MoctUticServerService {
             // 이전시간보다 큰 시간중에 가장 작은 시간을 얻어온다.
             TbCheckTraffic checkTrafficTime = this.repo.findCheckTrafficMoct(prevTrafficTime);
             if (checkTrafficTime == null) {
-                ApplicationRepository.processState.setError("findCheckTrafficMoct failed.");
                 log.info("[TRAF] {}: no traffic data. prevTrafficTime: {}", LogUtils.elapsedLog("TrafficTime"), prevTrafficTime);
                 return ++result;
             }

+ 1 - 1
moct-utic-server/src/main/resources/mybatis/mapper/MoctUticServerMapper.xml

@@ -44,7 +44,7 @@
     <insert id="insertCenterSend" parameterType="com.utic.its.common.entity.TbSndLog">
         <![CDATA[
         INSERT INTO UTIADMIN.CENTER_SEND(LOGDATE, CENTERID, INFOTYPE, DATACNT)
-        VALUES(SYSDATE, 'YYYYMMDDHH24MISS'), #{obj.toCenterId}, #{obj.infoKind}, #{obj.dataCnt})
+        VALUES(SYSDATE, #{obj.toCenterId}, #{obj.infoKind}, #{obj.dataCnt})
         ]]>
     </insert>
 

+ 36 - 7
rota-utic-client/src/main/java/com/utic/its/rota/utic/client/dao/repository/RotaUticClientRepository.java

@@ -5,6 +5,7 @@ import com.utic.its.asn1.its.CurrentLinkState;
 import com.utic.its.asn1.its.IncidentConditions;
 import com.utic.its.common.annotation.SqlOperation;
 import com.utic.its.common.dao.mapper.BatchDaoService;
+import com.utic.its.common.dto.CenterDto;
 import com.utic.its.common.entity.TbCenter;
 import com.utic.its.common.entity.TbRcvLog;
 import com.utic.its.rota.utic.client.dao.mapper.RotaUticClientMapper;
@@ -12,9 +13,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.springframework.stereotype.Repository;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 
 @Slf4j
 @Repository
@@ -28,9 +27,15 @@ public class RotaUticClientRepository extends BatchDaoService {
         this.mapper = mapper;
     }
 
-    public List<HashMap<String, Object>> getRcvLinkTraffic(String regDate, String fromCenterId, String toCenterId, List<CurrentLinkState> req) {
-        //HashMap<Long, Long> linkMap = new HashMap<Long, Long>();
+    public List<HashMap<String, Object>> getRcvLinkTraffic(CenterDto center, String regDate, String fromCenterId, String toCenterId, List<CurrentLinkState> req) {
+        if (regDate.equals(center.getRcvLinkRegDate())) {
+            center.setRcvLinkRegDate(regDate);
+            center.initRcvLinkDupCheckSet();
+        }
+        Set<String> dupCheckSet = center.getRcvLinkDupCheckSet(); // 중복 체크용
 
+        int total = req.size();
+        int dup = 0;
         List<HashMap<String, Object>> lists = new ArrayList<>();
         for (CurrentLinkState obj : req) {
             HashMap<String, Object> param = new HashMap<>();
@@ -63,6 +68,14 @@ public class RotaUticClientRepository extends BatchDaoService {
                 continue;
             }
 
+            // 중복 키 생성
+            if (dupCheckSet.contains(linkNumber)) {
+                dup++;
+                //log.info("RcvLinkTraffic: duplicate ==> {}", linkNumber);
+                continue;
+            }
+            dupCheckSet.add(linkNumber);
+
             param.put("REGDATE",            regDate);
             param.put("TOCENTERID",         toCenterId);
             param.put("LINKNUMBER",         linkNumber);
@@ -74,6 +87,9 @@ public class RotaUticClientRepository extends BatchDaoService {
 
             lists.add(param);
         }
+        if (dup > 0) {
+            log.warn("getRcvLinkTraffic: {}, {}, Total: {} / Duplicate: {}.", fromCenterId, regDate, total, dup);
+        }
         return lists;
     }
 
@@ -88,8 +104,21 @@ public class RotaUticClientRepository extends BatchDaoService {
     }
 
     @SqlOperation(type = SqlOperation.SqlType.INSERT, table = "RCV_LINK_TRAFFIC", param = "fromCenterId", param2 = "regDate")
-    public int insertRcvLinkTraffic(String regDate, String fromCenterId, String toCenterId, List<CurrentLinkState> req) {
-        return insertBatch("insertRcvLinkTraffic", getRcvLinkTraffic(regDate, fromCenterId, toCenterId, req));
+    public int insertRcvLinkTraffic(CenterDto center, String regDate, String fromCenterId, String toCenterId, List<CurrentLinkState> req) {
+        List<HashMap<String, Object>> reqJob = getRcvLinkTraffic(center, regDate, fromCenterId, toCenterId, req);
+        int reqCount = reqJob.size();
+        if (reqCount == 0) {
+            return req.size();
+        }
+
+        int result = insertBatchRcvTraffic("insertRcvLinkTraffic", fromCenterId, regDate, reqJob);
+        if (result != reqCount) {
+                log.warn("insertRcvLinkTraffic: {}, curRegDate: {}, setRegDate: {}, curCount: {}, setCount: {}",
+                        fromCenterId,
+                        regDate, center.getRcvLinkRegDate(),
+                        reqCount, center.getRcvLinkDupCheckSet().size());
+        }
+        return result;
     }
 
     @SqlOperation(type = SqlOperation.SqlType.DELETE, table = "RCV_LINK_TRAFFIC")

+ 7 - 1
rota-utic-client/src/main/java/com/utic/its/rota/utic/client/process/DbmsDataProcessService.java

@@ -2,6 +2,7 @@ package com.utic.its.rota.utic.client.process;
 
 import com.utic.its.asn1.its.CurrentLinkState;
 import com.utic.its.asn1.its.IncidentConditions;
+import com.utic.its.common.dto.CenterDto;
 import com.utic.its.common.dto.RecvPacketInfo;
 import com.utic.its.common.entity.TbRcvLog;
 import com.utic.its.common.repository.ApplicationRepository;
@@ -39,13 +40,18 @@ public class DbmsDataProcessService extends DbmsDataProcess {
             return;
         }
         final String fromCenterId = data.getCenter().getCenterId();
+        final CenterDto center = ApplicationRepository.CENTER_MAP.get(fromCenterId);
 
         int result = 0;
         TbRcvLog rcvLog;
         switch(type) {
             case DbmsData.DBMS_RCV_LINK_TRAFFIC:
+                if (center == null) {
+                    log.error("DbmsDataProcessService.process: insertRcvLinkTraffic, unknown fromCenterId: [{}].", fromCenterId);
+                    return;
+                }
                 final List<CurrentLinkState> trafficLists = (List<CurrentLinkState>) data.getData();
-                result = this.repo.insertRcvLinkTraffic(data.getRegDate(), fromCenterId, ApplicationRepository.CENTER.getCenterId(), trafficLists);
+                result = this.repo.insertRcvLinkTraffic(center, data.getRegDate(), fromCenterId, ApplicationRepository.CENTER.getCenterId(), trafficLists);
                 if (result < 0) {
                     log.error("DbmsDataProcessService.process: insertRcvLinkTraffic Error: [{}], {}.", fromCenterId, trafficLists);
                 }

+ 4 - 4
rota-utic-server/src/main/java/com/utic/its/rota/utic/server/dao/mapper/RotaUticServerMapper.java

@@ -12,10 +12,10 @@ public interface RotaUticServerMapper {
     List<TbCenter> findCenter();
     List<TbCenter> findRegionCenter();
 
-    int insertSndIncident(@Param("toCenterId") String toCenterId, @Param("fromCenterId") String fromCenterId);
-    int updateSndIncident(@Param("toCenterId") String toCenterId, @Param("fromCenterId") String fromCenterId);
-    List<TbSndIncident> findAllSndIncident(@Param("toCenterId") String toCenterId, @Param("fromCenterId") String fromCenterId);
-    int deleteSndIncident();
+    int insertSndIncident(@Param("clusterId") Integer clusterId, @Param("toCenterId") String toCenterId, @Param("fromCenterId") String fromCenterId);
+    int updateSndIncident(@Param("clusterId") Integer clusterId, @Param("toCenterId") String toCenterId, @Param("fromCenterId") String fromCenterId);
+    List<TbSndIncident> findAllSndIncident(@Param("clusterId") Integer clusterId, @Param("toCenterId") String toCenterId, @Param("fromCenterId") String fromCenterId);
+    int deleteSndIncident(@Param("clusterId") Integer clusterId);
 
     int insertCenterSend(@Param("obj") TbSndLog obj);
     int insertCenterSendInfo(@Param("obj") TbSndLog obj);

+ 8 - 8
rota-utic-server/src/main/java/com/utic/its/rota/utic/server/dao/repository/RotaUticServerRepository.java

@@ -39,18 +39,18 @@ public class RotaUticServerRepository {
     }
 
     @SqlOperation(type = SqlOperation.SqlType.SELECT, table = "SND_INCIDENT", param = "toCenterId", logging = false)
-    public List<TbSndIncident> findAllSndIncident(String toCenterId, String fromCenterId) {
-        return this.mapper.findAllSndIncident(toCenterId, fromCenterId);
+    public List<TbSndIncident> findAllSndIncident(Integer clusterId, String toCenterId, String fromCenterId) {
+        return this.mapper.findAllSndIncident(clusterId, toCenterId, fromCenterId);
     }
 
     @SqlOperation(type = SqlOperation.SqlType.INSERT, table = "SND_INCIDENT", param = "toCenterId", logging = false)
-    public int insertSndIncident(String toCenterId, String fromCenterId) {
-        return this.mapper.insertSndIncident(toCenterId, fromCenterId);
+    public int insertSndIncident(Integer clusterId, String toCenterId, String fromCenterId) {
+        return this.mapper.insertSndIncident(clusterId, toCenterId, fromCenterId);
     }
 
     @SqlOperation(type = SqlOperation.SqlType.UPDATE, table = "SND_INCIDENT", param = "toCenterId")
-    public int updateSndIncident(String toCenterId, String fromCenterId) {
-        return this.mapper.updateSndIncident(toCenterId, fromCenterId);
+    public int updateSndIncident(Integer clusterId, String toCenterId, String fromCenterId) {
+        return this.mapper.updateSndIncident(clusterId, toCenterId, fromCenterId);
     }
 
     @SqlOperation(type = SqlOperation.SqlType.INSERT, table = "CENTER_SEND@UTISDB", param = "toCenterId")
@@ -64,8 +64,8 @@ public class RotaUticServerRepository {
     }
 
     @SqlOperation(type = SqlOperation.SqlType.DELETE, table = "SND_INCIDENT")
-    public int deleteSndIncident() {
-        return this.mapper.deleteSndIncident();
+    public int deleteSndIncident(Integer clusterId) {
+        return this.mapper.deleteSndIncident(clusterId);
     }
 
 }

+ 2 - 2
rota-utic-server/src/main/java/com/utic/its/rota/utic/server/process/DbmsDataProcessService.java

@@ -40,7 +40,7 @@ public class DbmsDataProcessService extends DbmsDataProcess {
                 incLog.setClusterId(this.clusterConfig.getId());
                 if (DbmsData.D_KIND_INC.equals(incLog.getInfoKind())) {
                     // 돌발 전송 정보를 업데이트 한다.
-                    this.repo.updateSndIncident(toCenterId, incLog.getFromCenterId());
+                    this.repo.updateSndIncident(this.clusterConfig.getId(), toCenterId, incLog.getFromCenterId());
 
                     // 중앙센터 로그 저장
                     incLog.setInfoKind(DbmsData.D_INFOTYPE_INCD);   // ITS 돌발정보 전송
@@ -68,7 +68,7 @@ public class DbmsDataProcessService extends DbmsDataProcess {
                 }
                 break;
             case DbmsData.DBMS_DATA_DELETE_SND_INCIDENT:
-                this.repo.deleteSndIncident();
+                this.repo.deleteSndIncident(this.clusterConfig.getId());
                 break;
             default:
                 log.error("DbmsDataProcessService.process: Unknown Request [{}], {}.", toCenterId, type);

+ 1 - 1
rota-utic-server/src/main/java/com/utic/its/rota/utic/server/service/ApplicationService.java

@@ -36,7 +36,7 @@ public class ApplicationService {
         if (!this.schedule.isUseDeleteSndIncident()) {
             return true;
         }
-        int result = this.repo.deleteSndIncident();
+        int result = this.repo.deleteSndIncident(this.clusterConfig.getId());
         return result >= 0;
     }
 

+ 7 - 10
rota-utic-server/src/main/java/com/utic/its/rota/utic/server/service/RotaUticServerService.java

@@ -3,7 +3,6 @@ package com.utic.its.rota.utic.server.service;
 import com.its.common.utils.SysUtils;
 import com.its.common.utils.TimeUtils;
 import com.utic.its.common.dto.CenterDto;
-import com.utic.its.common.entity.TbCheckIncident;
 import com.utic.its.common.entity.TbSndIncident;
 import com.utic.its.common.entity.TbSndLog;
 import com.utic.its.common.entity.TbTrafficCenter;
@@ -158,23 +157,21 @@ public class RotaUticServerService {
                     continue;
                 }
 
-                TbCheckIncident incident = TbCheckIncident.builder()
-                        .toCenterId(center.getCenterId())
-                        .fromCenterId(ApplicationRepository.CENTER.getCenterId())
-                        .build();
+                final String toCenterId = center.getCenterId();
+                final String fromCenterId = ApplicationRepository.CENTER.getCenterId();
 
-                MDC.put("id", incident.getToCenterId());
+                MDC.put("id", toCenterId);
 
-                int insIncident = this.repo.insertSndIncident(incident.getToCenterId(), incident.getFromCenterId());
+                int insIncident = this.repo.insertSndIncident(this.clusterConfig.getId(), toCenterId, fromCenterId);
                 if (insIncident > 0) {
-                    log.info("[INCD] {}: [{}], {} EA.", LogUtils.elapsedLog("insertSndIncident"), incident.getToCenterId(), insIncident);
+                    log.info("[INCD] {}: [{}], {} EA.", LogUtils.elapsedLog("insertSndIncident"), toCenterId, insIncident);
                 }
                 if (insIncident < 0) {
                     ApplicationRepository.processState.setError("insertSndIncident failed.");
                 }
 
                 // 지역센터에 전송할 돌발정보를 메모리에 저장하고 지역센터에 전송하여야 한다.
-                List<TbSndIncident> result = this.repo.findAllSndIncident(incident.getToCenterId(), incident.getFromCenterId());
+                List<TbSndIncident> result = this.repo.findAllSndIncident(this.clusterConfig.getId(), toCenterId, fromCenterId);
                 if (result == null) {
                     // 조회시 오류가 발생한 경우
                     ApplicationRepository.processState.setError("findAllSndIncident failed.");
@@ -183,7 +180,7 @@ public class RotaUticServerService {
 
                 center.getSendIncident().init(baseTime, result);
                 if (!result.isEmpty()) {
-                    log.info("[INCD] {}: [{}], {} EA.", LogUtils.elapsedLog("findAllSndIncident"), incident.getToCenterId(), result.size());
+                    log.info("[INCD] {}: [{}], {} EA.", LogUtils.elapsedLog("findAllSndIncident"), toCenterId, result.size());
                     this.executor.executeSendIncident(center);
 
                     // CENTER_SEND_INFO 로깅

+ 11 - 6
rota-utic-server/src/main/resources/mybatis/mapper/RotaUticServerMapper.xml

@@ -40,11 +40,12 @@
 
     <insert id="insertSndIncident" parameterType="java.lang.String">
         <![CDATA[
-        INSERT INTO SND_INCIDENT(TOCENTERID, LINK_LINKIDNUMBER, LOGDATE, FROMCENTERID, NODE_NODEIDNUMBER,
+        INSERT INTO SND_INCIDENT(CLUSTERID, TOCENTERID, LINK_LINKIDNUMBER, LOGDATE, FROMCENTERID, NODE_NODEIDNUMBER,
                                  CONTACTORGANIZATIONNAMETEXT, DESCRIPTIONTYPEINCIDENTCODE, DESCRIPTIONTYPEINCIDENTOTHER,
                                  INCIDENTVEHICLESINVOLVEDCODE, INCIDENTVEHICLESINVOLVEDOTHER, INCIDENTSTATUSCODE,
                                  INCIDENTSTATUSOTHER, UPDATETYPECODE, UPDATETYPEOTHER, SENDYN)
-        SELECT #{toCenterId},
+        SELECT #{clusterId},
+               #{toCenterId},
                LINK_ID,
                SYSDATE,
                #{fromCenterId},
@@ -62,8 +63,9 @@
         FROM UTISINCI.TB_IMS_DATA@UTISDB I, CENTER_REGION R
         WHERE NOT EXISTS (SELECT 'X'
                           FROM SND_INCIDENT
-                          WHERE I.INCIDENT_ID = NODE_NODEIDNUMBER
+                          WHERE CLUSTERID     = #{clusterId}
                             AND TOCENTERID    = #{toCenterId}
+                            AND I.INCIDENT_ID = NODE_NODEIDNUMBER
                          )
           AND REPORT_DATE   > SYSDATE - 720/1440
           AND R.CENTERID    = #{toCenterId}
@@ -79,7 +81,8 @@
         <![CDATA[
         UPDATE SND_INCIDENT
            SET SENDYN = 'Y'
-        WHERE TOCENTERID   = #{toCenterId}
+        WHERE CLUSTERID    = #{clusterId}
+          AND TOCENTERID   = #{toCenterId}
           AND LOGDATE      > SYSDATE - 720/1440
           AND FROMCENTERID = #{fromCenterId}
           AND SENDYN      != 'Y'
@@ -101,7 +104,8 @@
                UPDATETYPECODE                AS updateTypeCode,
                UPDATETYPEOTHER               AS updateTypeOther
         FROM SND_INCIDENT
-        WHERE TOCENTERID   = #{toCenterId}
+        WHERE CLUSTERID    = #{clusterId}
+          AND TOCENTERID   = #{toCenterId}
           AND LOGDATE      > SYSDATE - 720/1440
           AND FROMCENTERID = #{fromCenterId}
           AND SENDYN      != 'Y'
@@ -112,7 +116,8 @@
     <delete id="deleteSndIncident">
         <![CDATA[
         DELETE FROM SND_INCIDENT
-        WHERE LOGDATE < SYSDATE - 720/1440 -- 12 시간전
+        WHERE CLUSTERID = #{clusterId}
+          AND LOGDATE   < SYSDATE - 720/1440 -- 12 시간전
         ]]>
     </delete>
 

+ 35 - 0
utic-its-common/src/main/java/com/utic/its/common/dao/mapper/BatchDaoService.java

@@ -79,6 +79,41 @@ public abstract class BatchDaoService {
         return this.count;
     }
 
+    // insert, merge
+    public int insertBatchRcvTraffic(String mapperName, String centerCd, String regDate, List<HashMap<String, Object>> lists) {
+        int total = lists.size();
+        if (total == 0) {
+            log.info("[BATCH] insertBatchRcvTraffic: {}, {}, {}: No Data.", mapperName, centerCd, regDate);
+            return 0;
+        }
+
+        int jobCnt = 0;
+        try (SqlSession sqlSession = this.sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
+            for (Map<String, Object> param : lists) {
+                try {
+                    sqlSession.insert(mapperName, param);
+                    jobCnt++;
+                    if (jobCnt % this.MAX_BATCH_SIZE == 0 ) {
+                        sqlSession.flushStatements();
+                    }
+                }
+                catch (Exception e) {
+                    log.error("[BATCH] insertBatchRcvTraffic: {}, {}, {}, {}/{} EA. insert Exception: {}.",
+                            mapperName, centerCd, regDate, total, jobCnt, e.getMessage());
+                    break;
+                }
+            }
+            sqlSession.flushStatements();
+            sqlSession.commit();
+        }
+        catch (Exception e) {
+            log.error("[BATCH] insertBatchRcvTraffic: {}, {}, {}, {}/{} EA. SQL Exception: {}.",
+                    mapperName, centerCd, regDate, total, jobCnt, e.getMessage());
+        }
+        this.count = jobCnt;
+        return this.count;
+    }
+
     // Only for update
     public int updateBatch(String mapperName, List<HashMap<String, Object>> lists) {
         int total = lists.size();

+ 10 - 5
utic-its-common/src/main/java/com/utic/its/common/dto/CenterDto.java

@@ -24,10 +24,7 @@ import lombok.*;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 
 @Slf4j
 @Getter
@@ -82,7 +79,9 @@ public class CenterDto implements Serializable {
     private List<SendPacketInfo> sendTrafficList = new ArrayList<>();
     @Builder.Default
     private List<SendPacketInfo> sendIncidentList = new ArrayList<>();
-
+    @Builder.Default
+    private Set<String> rcvLinkDupCheckSet = new HashSet<>(); // 중복 체크용
+    private String rcvLinkRegDate;
 
     public void setMaxCount(int maxIncidentCount, int maxTrafficCount) {
         this.sendIncident.setMaxSendIncidentCount(maxIncidentCount);
@@ -145,6 +144,11 @@ public class CenterDto implements Serializable {
         this.recvIncidentListMap = new HashMap<>();
         this.sendTrafficList = new ArrayList<>();
         this.sendIncidentList = new ArrayList<>();
+        this.rcvLinkDupCheckSet = new HashSet<>();
+    }
+
+    public void initRcvLinkDupCheckSet() {
+        this.rcvLinkDupCheckSet = new HashSet<>();
     }
 
     public void setCenter(CenterDto center) {
@@ -177,6 +181,7 @@ public class CenterDto implements Serializable {
         this.recvIncidentListMap = center.getRecvIncidentListMap();
         this.sendTrafficList = center.getSendTrafficList();
         this.sendIncidentList = center.getSendIncidentList();
+        this.rcvLinkDupCheckSet = center.getRcvLinkDupCheckSet();
     }
     public String getLogKey() {
         return this.centerId;

+ 18 - 3
utic-its-common/src/main/java/com/utic/its/common/utils/SystemHealth.java

@@ -82,9 +82,24 @@ public class SystemHealth {
 
         this.memUsage = (double) this.usedMemory / this.maxMemory * 100;
         // For Linux/Unix, Windows(Perhaps)
-        OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
-        this.cpuUsage = osBean.getSystemCpuLoad() * 100;
-        this.loadAverage = osBean.getSystemLoadAverage(); // 1분 평균
+//        OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
+//        this.cpuUsage = osBean.getSystemCpuLoad() * 100;
+//        this.loadAverage = osBean.getSystemLoadAverage(); // 1분 평균
+        try {
+            OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
+            if (osBean != null) {
+                this.cpuUsage = osBean.getSystemCpuLoad() * 100;
+                this.loadAverage = osBean.getSystemLoadAverage(); // 1분 평균
+            }
+            else {
+                this.cpuUsage = 0;
+                this.loadAverage = 0;
+            }
+        }
+        catch (Throwable t) {
+            this.cpuUsage = 0;
+            this.loadAverage = 0;
+        }
 
         this.threadCount = ManagementFactory.getThreadMXBean().getThreadCount();
         this.peakThreadCount = ManagementFactory.getThreadMXBean().getPeakThreadCount();