shjung před 3 roky
rodič
revize
3984746304

+ 4 - 0
src/main/java/com/its/op/config/JobConfig.java

@@ -18,6 +18,10 @@ import javax.annotation.PostConstruct;
 public class JobConfig {
 
     private boolean cctvPreset = false;
+    private boolean baseDbms = false;
+    private boolean fcltStts = false;
+    private boolean unitStts = false;
+    private boolean dbSvrStts = true;
 
     @PostConstruct
     private void init() {

+ 10 - 0
src/main/java/com/its/op/dao/repository/its/database/TbDbSvrSttsRepository.java

@@ -3,8 +3,11 @@ package com.its.op.dao.repository.its.database;
 import com.its.op.entity.its.database.TbDbSvrStts;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -13,4 +16,11 @@ public interface TbDbSvrSttsRepository extends JpaRepository<TbDbSvrStts, String
 
     @Query("select p from TbDbSvrStts p")
     List<TbDbSvrStts> findAll();
+
+    @Transactional
+    @Modifying
+    @Query("update TbDbSvrStts p set p.tblsNm = :tblsNm, p.tblsRmndCpct = :tblsRmndCpct, p.useSesn = :useSesn, p.updtDt = :updtDt " +
+           " where p.dbSvrId = :dbSvrId")
+    void updateStts(@Param("dbSvrId") String dbSvrId, @Param("tblsNm") String tblsNm, @Param("tblsRmndCpct") String tblsRmndCpct, @Param("useSesn") String useSesn, @Param("updtDt") String updtDt);
+
 }

+ 16 - 0
src/main/java/com/its/op/dto/its/database/TbDbSvrSttsDto.java

@@ -2,10 +2,12 @@ package com.its.op.dto.its.database;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.database.TbDbSvrStts;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Builder;
 import lombok.Data;
+import lombok.ToString;
 
 import java.io.Serializable;
 
@@ -13,6 +15,7 @@ import java.io.Serializable;
  * DB 서버 상태 DTO Class
  */
 @Data
+@ToString
 @Builder
 @ApiModel("TbDbSvrSttsDto(DB 서버 상태)")
 public class TbDbSvrSttsDto implements Serializable {
@@ -58,5 +61,18 @@ public class TbDbSvrSttsDto implements Serializable {
     private String updtDt;
 
     // Code Description Field
+    public TbDbSvrStts toEntity() {
+        return TbDbSvrStts.builder()
+                .dbSvrId(this.dbSvrSid)
+                .dbSvrNm(this.dbSvrNm)
+                .tblsNm(this.tblsNm)
+                .tblsRmndCpct(this.tblsRmndCpct)
+                .useSesn(this.useSesn)
+                .dbSvrIp(this.dbSvrIp)
+                .dbSvrPort(this.dbSvrPort)
+                .dbSvrSid(this.dbSvrSid)
+                .updtDt(this.updtDt)
+                .build();
+    }
 
 }

+ 19 - 17
src/main/java/com/its/op/dto/its/vms/TbVmsFormDto.java

@@ -94,7 +94,9 @@ public class TbVmsFormDto implements Serializable {
     @Getter
     @Setter
     @ToString
-    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    @Builder
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    @AllArgsConstructor
     public static class TbVmsFormUpdReq {
 
         @ApiModelProperty("VMS FORM ID, Nullable = N, NUMBER(5)")  // N NUMBER(5)
@@ -154,22 +156,22 @@ public class TbVmsFormDto implements Serializable {
         @ApiModelProperty("FORM 객체 목록")
         @JsonProperty("objects")
         List<TbVmsFormObjectDto.TbVmsFormObjectUpdReq> objects = new ArrayList<>();
-
-        @Builder
-        public TbVmsFormUpdReq(Integer vms_form_id, String vms_type_cd, Integer vms_form_type_cd, Long vms_form_bckg_hue_cd, String vms_form_nm, String vms_form_expl, Integer vms_msg_dspl_drct_cd, Integer symb_lib_nmbr, byte[] vms_form_imag, Integer vms_msg_dspl_mthd_cd, Long cctv_mngm_nmbr, List<TbVmsFormObjectDto.TbVmsFormObjectUpdReq> objects) {
-            this.vmsFormId = vms_form_id;
-            this.vmsTypeCd = vms_type_cd;
-            this.vmsFormTypeCd = vms_form_type_cd;
-            this.vmsFormBckgHueCd = vms_form_bckg_hue_cd;
-            this.vmsFormNm = vms_form_nm;
-            this.vmsFormExpl = vms_form_expl;
-            this.vmsMsgDsplDrctCd = vms_msg_dspl_drct_cd;
-            this.symbLibNmbr = symb_lib_nmbr;
-            this.vmsFormImag = vms_form_imag;
-            this.vmsMsgDsplMthdCd = vms_msg_dspl_mthd_cd;
-            this.cctvMngmNmbr = cctv_mngm_nmbr;
-            this.objects = objects;
-        }
+//
+//        @Builder
+//        public TbVmsFormUpdReq(Integer vms_form_id, String vms_type_cd, Integer vms_form_type_cd, Long vms_form_bckg_hue_cd, String vms_form_nm, String vms_form_expl, Integer vms_msg_dspl_drct_cd, Integer symb_lib_nmbr, byte[] vms_form_imag, Integer vms_msg_dspl_mthd_cd, Long cctv_mngm_nmbr, List<TbVmsFormObjectDto.TbVmsFormObjectUpdReq> objects) {
+//            this.vmsFormId = vms_form_id;
+//            this.vmsTypeCd = vms_type_cd;
+//            this.vmsFormTypeCd = vms_form_type_cd;
+//            this.vmsFormBckgHueCd = vms_form_bckg_hue_cd;
+//            this.vmsFormNm = vms_form_nm;
+//            this.vmsFormExpl = vms_form_expl;
+//            this.vmsMsgDsplDrctCd = vms_msg_dspl_drct_cd;
+//            this.symbLibNmbr = symb_lib_nmbr;
+//            this.vmsFormImag = vms_form_imag;
+//            this.vmsMsgDsplMthdCd = vms_msg_dspl_mthd_cd;
+//            this.cctvMngmNmbr = cctv_mngm_nmbr;
+//            this.objects = objects;
+//        }
 
         public TbVmsForm toEntity() {
             return TbVmsForm.builder()

+ 28 - 12
src/main/java/com/its/op/scheduler/ItsApiScheduler.java

@@ -1,10 +1,7 @@
 package com.its.op.scheduler;
 
 import com.its.op.config.JobConfig;
-import com.its.op.scheduler.job.BaseDbmsJobThread;
-import com.its.op.scheduler.job.CctvPsetCtrlScnrJobThread;
-import com.its.op.scheduler.job.FcltSttsJobThread;
-import com.its.op.scheduler.job.UnitSttsJobThread;
+import com.its.op.scheduler.job.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
@@ -25,6 +22,7 @@ public class ItsApiScheduler {
     private final FcltSttsJobThread fcltSttsJobThread;
     private final UnitSttsJobThread unitSttsJobThread;
     private final BaseDbmsJobThread baseDbmsJobThread;
+    private final DbSvrSttsJobThread dbSvrSttsJobThread;
 
     @PreDestroy
     public void onShutDown() {
@@ -37,7 +35,7 @@ public class ItsApiScheduler {
     @Scheduled(cron = "0 * * * * *")  // 1분 주기 작업 실행
     public void jobCctvPsetScnr() {
         if (this.jobConfig.isCctvPreset()) {
-            //this.cctvPsetScnrThread.run();
+            this.cctvPsetScnrThread.run();
         }
     }
 
@@ -47,25 +45,43 @@ public class ItsApiScheduler {
     @Async
     @Scheduled(cron = "5 * * * * *")  // 60초 주기 작업 실행
     public void pollingBaseDbms() {
-        //this.baseDbmsJobThread.run();
+       if (this.jobConfig.isBaseDbms()) {
+           this.baseDbmsJobThread.run();
+       }
     }
 
     /**
-     * 시설물 상태정보 조회 및 전송
+     * 프로세스 상태정보 조회 및 전송
      */
     @Async
     @Scheduled(cron = "20 * * * * *")  // 60초 주기 작업 실행
+    public void pollingUnitStts() {
+        if (this.jobConfig.isUnitStts()) {
+            this.unitSttsJobThread.run();
+        }
+    }
+
+    /**
+     * 시설물 상태정보 조회 및 전송
+     */
+    @Async
+    @Scheduled(cron = "25 * * * * *")  // 60초 주기 작업 실행
     public void pollingFcltStts() {
-        //this.fcltSttsJobThread.run();
+        if (this.jobConfig.isFcltStts()) {
+            this.fcltSttsJobThread.run();
+        }
     }
 
     /**
-     * 프로세스 상태정보 조회 및 전송
+     * DB Server Stts Update
      */
     @Async
-    @Scheduled(cron = "10 * * * * *")  // 60초 주기 작업 실행
-    public void pollingUnitStts() {
-        //this.unitSttsJobThread.run();
+    //@Scheduled(cron = "40 0/1 * * * *")  // 5분 주기 작업 실행
+    @Scheduled(cron = "0/10 * * * * *")  // 5분 주기 작업 실행
+    public void jobDbSvrStts() {
+        if (this.jobConfig.isDbSvrStts()) {
+            this.dbSvrSttsJobThread.run();
+        }
     }
 
     /*@Async

+ 140 - 0
src/main/java/com/its/op/scheduler/job/DbSvrSttsJobThread.java

@@ -0,0 +1,140 @@
+package com.its.op.scheduler.job;
+
+import com.its.op.dao.repository.its.database.TbDbSvrSttsRepository;
+import com.its.op.dto.its.database.TbDbSvrSttsDto;
+import com.its.op.entity.its.database.TbDbSvrStts;
+import com.its.utils.ItsUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StopWatch;
+
+import javax.annotation.PostConstruct;
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@AllArgsConstructor
+@Service
+public class DbSvrSttsJobThread {
+
+    private final TbDbSvrSttsRepository dbSvrSttsRepo;
+    private final String JDBC_DRIVER = "com.tmax.tibero.jdbc.TbDriver";
+    private final String username = "sys";
+    private final String password = "tibero";
+
+    @PostConstruct
+    private void init() {
+        log.info("{}", this);
+    }
+
+    @Async("schJobExecutor")
+    public void run() {
+
+        log.info("START: DbSvrSttsJobThread.run: {}", Thread.currentThread().getName());
+
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
+        List<TbDbSvrSttsDto> result = new ArrayList<TbDbSvrSttsDto>();
+        List<TbDbSvrStts> dbms = this.dbSvrSttsRepo.findAll();
+        dbms.forEach(db -> {
+            try {
+                TbDbSvrSttsDto dto = executeDbSvrStts(db);
+                result.add(dto);
+            }
+            catch(Exception e) {
+                log.error("run: Exception, {}, {}", db.getDbSvrId(), e.getMessage());
+            }
+        });
+
+        // 결과 저장
+        result.forEach((obj) -> {
+            this.dbSvrSttsRepo.updateStts(obj.getDbSvrId(), obj.getTblsNm(), obj.getTblsRmndCpct(), obj.getUseSesn(), obj.getUpdtDt());
+        });
+        stopWatch.stop();
+        log.info("--END: DbSvrSttsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
+    }
+
+    TbDbSvrSttsDto executeDbSvrStts(TbDbSvrStts db) throws SQLException {
+        TbDbSvrSttsDto dto = db.toDto();
+        String dbUrl = String.format("jdbc:tibero:thin:@%s:%s:%s", db.getDbSvrIp(), db.getDbSvrPort(), db.getDbSvrSid());
+        String sql1 = 
+                "SELECT A.TABLESPACE_NAME AS TBLS_NM, " +
+                "       100 - ROUND((A.TOTAL - NVL(B.FREE,0))*100/TOTAL,2) AS TBLS_RMND_CPCT " +
+                "  FROM (SELECT X.TABLESPACE_NAME, ROUND((SUM(X.BYTES)/1024/1024),0) AS TOTAL " +
+                "          FROM DBA_DATA_FILES X " +
+                "         GROUP BY X.TABLESPACE_NAME) A, " +
+                "       (SELECT Y.TABLESPACE_NAME, ROUND((SUM(Y.BYTES)/1024/1024),0) AS FREE " +
+                "          FROM DBA_FREE_SPACE Y " +
+                "         GROUP BY Y.TABLESPACE_NAME) B " +
+                " WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+) " +
+                "   AND A.TABLESPACE_NAME IN (  'ITS_HIST_DATA' " +
+                "                             , 'ITS_HIST_INDX' " +
+                "                             , 'ITS_TBS_DATA' " +
+                "                             , 'ITS_TBS_INDX' " +
+                "                             , 'UTIS_HIST_DATA' " +
+                "                             , 'UTIS_HIST_INDX' " +
+                "                             , 'X' " +
+                "                             , 'Y' " +
+                "                             , 'D' " +
+                "                             , 'D' " +
+                "                             , 'D' " +
+                "                             )";
+
+        String sql2 =
+                "SELECT ROUND(RUNNING / TOTAL * 100, 1) AS USE_SESN " +
+                "  FROM (SELECT COUNT(1) AS TOTAL, SUM(DECODE(STATUS, 'RUNNING', 1, 0)) AS RUNNING FROM v$session)";
+
+        Connection conn = null;
+        try {
+            Class.forName(this.JDBC_DRIVER);
+            conn = DriverManager.getConnection(dbUrl, this.username, this.password);
+
+            String TBLS_NM = "";
+            double TBLS_RMND_CPCT = 100.0;
+            PreparedStatement stmt1 = conn.prepareStatement(sql1);
+            ResultSet rs1 = stmt1.executeQuery();
+            while(rs1.next()) {
+                String tblsNm = rs1.getString("TBLS_NM");
+                Double tblsRmndCpct = rs1.getDouble("TBLS_RMND_CPCT");
+                if (TBLS_RMND_CPCT > tblsRmndCpct) {
+                    TBLS_NM = tblsNm;
+                    TBLS_RMND_CPCT = tblsRmndCpct;
+                }
+            }
+            dto.setTblsNm(TBLS_NM);
+            dto.setTblsRmndCpct(String.valueOf(TBLS_RMND_CPCT));
+            rs1.close();
+            stmt1.close();
+
+            PreparedStatement stmt2 = conn.prepareStatement(sql2);
+            ResultSet rs2 = stmt2.executeQuery();
+            while(rs2.next()) {
+                Double useSesn = rs2.getDouble("USE_SESN");
+                dto.setUseSesn(String.valueOf(useSesn));
+            }
+            rs2.close();
+            stmt2.close();
+        }
+        catch(SQLException e) {
+            log.error("executeDbSvrStts: SQLException, {}, {}", db.getDbSvrIp(), e.getMessage());
+            throw new RuntimeException(e.getMessage(), e);
+        }
+        catch (ClassNotFoundException e) {
+            log.error("executeDbSvrStts: ClassNotFoundException, {}, {}", db.getDbSvrIp(), e.getMessage());
+            throw new RuntimeException(e.getMessage(), e);
+        }
+        finally {
+            if (conn != null) {
+                conn.close();
+            }
+        }
+
+        dto.setUpdtDt(ItsUtils.getSysTime());
+        return dto;
+    }
+
+}

+ 4 - 0
src/main/resources/application.yml

@@ -15,6 +15,10 @@ application:
 
   job-schedule:
     cctv-preset: false
+    base-dbms: false
+    fclt-stts: false
+    unit-stts: false
+    db-svr-stts: true
 
 server:
   port: 8999

+ 3 - 1
src/main/resources/static/application/facility/main/main-func.js

@@ -149,16 +149,18 @@ export async function fetchDbmsStts() {
 
 function updateDbmsStts(jsonData) {
     jsonData.forEach((obj) => {
+        const dbSeverName = $(".db" + obj.db_svr_id + "_dbSeverName");
         const tableSpaceName = $(".db" + obj.db_svr_id + "_tableName");
         const tableReamin = $(".db" + obj.db_svr_id + "_tableRemSpace");
         const useSession = $(".db" + obj.db_svr_id + "_useSession");
+        setHtml(dbSeverName, obj.db_svr_nm)
         setHtml(tableSpaceName, obj.tbls_nm);
 
         if(obj.tbls_rmnd_cpct <= 10) {
             tableReamin.css("color","red")
         }
         setHtml(tableReamin, obj.tbls_rmnd_cpct+" %");
-        
+
         if(obj.use_sesn >= 80) {
             useSession.css("color","red")
         }

+ 10 - 10
src/main/resources/static/application/facility/main/main.html

@@ -135,22 +135,22 @@
                             <td class ="tableColor">남은공간(%)</td>
                         </tr>
                         <tr class="db1_serverNameId">
-                            <td class ="tableColor">ITS DB</td>
+                            <td class ="db1_dbSeverName tableColor"></td>
                             <td class="db1_tableName valueColor"></td>
                             <td class="db1_tableRemSpace valueColor"></td>
                         </tr>
                         <tr class="db4_serverNameId">
-                            <td class ="tableColor">BIS DB</td>
+                            <td class ="db4_dbSeverName tableColor"></td>
                             <td class="db4_tableName valueColor"></td>
                             <td class="db4_tableRemSpace valueColor"></td>
                         </tr>
                         <tr class="db3_serverNameId">
-                            <td class ="tableColor">UTIS DB</td>
+                            <td class ="db3_dbSeverName tableColor"></td>
                             <td class="db3_tableName valueColor"></td>
                             <td class="db3_tableRemSpace valueColor"></td>
                         </tr>
                         <tr class="db6_serverNameId">
-                            <td class ="tableColor">신호 DB</td>
+                            <td class ="db6_dbSeverName tableColor"></td>
                             <td class="db6_tableName valueColor"></td>
                             <td class="db6_tableRemSpace valueColor"></td>
                         </tr>
@@ -163,15 +163,15 @@
                             <td  class ="tableColor"colspan="3">사용중 세션(%)</td>
                         </tr>
                         <tr class="db1_serverNameId">
-                            <td class ="tableColor">ITS DB #1</td>
+                            <td class ="db1_dbSeverName tableColor"></td>
                             <td class="db1_useSession valueColor"></td>
                         </tr>
                         <tr class="db2_serverNameId">
-                            <td class ="tableColor">ITS DB #2</td>
+                            <td class ="db2_dbSeverName tableColor"></td>
                             <td class="db2_useSession valueColor"></td>
                         </tr>
                         <tr class="db3_serverNameId">
-                            <td class ="tableColor">UTIS DB</td>
+                            <td class ="db3_dbSeverName tableColor"></td>
                             <td class="db3_useSession valueColor"></td>
                         </tr>
                     </table>
@@ -183,15 +183,15 @@
                             <td  class ="tableColor"colspan="3">사용중 세션(%)</td>
                         </tr>
                         <tr class="db4_serverNameId">
-                            <td class ="tableColor">BIS DB #1</td>
+                            <td class ="db4_dbSeverName tableColor"></td>
                             <td class="db4_useSession valueColor"></td>
                         </tr>
                         <tr class="db5_serverNameId">
-                            <td class ="tableColor">BIS DB #2</td>
+                            <td class ="db5_dbSeverName tableColor"></td>
                             <td class="db5_useSession valueColor"></td>
                         </tr>
                         <tr class="db6_serverNameId">
-                            <td class ="tableColor">신호 DB</td>
+                            <td class ="db6_dbSeverName tableColor"></td>
                             <td class="db6_useSession valueColor"></td>
                         </tr>
                     </table>