Browse Source

add batch job

shjung 17 hours ago
parent
commit
112ab2c5fb

+ 5 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -1,6 +1,11 @@
 <component name="InspectionProjectProfileManager">
   <profile version="1.0">
     <option name="myName" value="Project Default" />
+    <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
+      <option name="processCode" value="true" />
+      <option name="processLiterals" value="true" />
+      <option name="processComments" value="true" />
+    </inspection_tool>
     <inspection_tool class="SqlNoDataSourceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="UNCHECKED_WARNING" enabled="false" level="WARNING" enabled_by_default="false" />
   </profile>

+ 22 - 6
src/main/java/com/its/vds/stat/server/VdsStatServerApplication.java

@@ -1,17 +1,20 @@
 package com.its.vds.stat.server;
 
 import com.its.vds.stat.server.config.ApplicationConfig;
+import com.its.vds.stat.server.controller.VdsStatBatchServerController;
 import com.its.vds.stat.server.service.UnitSystService;
 import com.its.vds.stat.server.utils.SpringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.Banner;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.context.ApplicationPidFileWriter;
+import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationListener;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.event.ContextClosedEvent;
@@ -29,7 +32,8 @@ public class VdsStatServerApplication
 
 	private static boolean isTerminated = false;
 	public static final String APPLICATION_NAME = "vds-stat-server";
-
+	@Autowired
+	private static ApplicationContext context;
 
 	public static void main(String[] args) {
 		SpringApplication application = new SpringApplicationBuilder()
@@ -44,7 +48,7 @@ public class VdsStatServerApplication
 	@Override
 	public void run(String... args) throws Exception {
 
-		ApplicationConfig applicationConfig = (ApplicationConfig) SpringUtils.getBean(ApplicationConfig.class);
+		ApplicationConfig applicationConfig = SpringUtils.getBean(ApplicationConfig.class);
 
 		log.info("");
 		log.info("");
@@ -57,15 +61,27 @@ public class VdsStatServerApplication
 		log.info("**          {}", applicationConfig.getProcessId());
 		log.info("** startup: {}", applicationConfig.getBootingTime());
 		log.info("************************************************************************************");
+		if (args.length == 2) {
+			String startStr = args[0];
+			String endStr = args[1];
+
+			applicationConfig.setStartSchedule(false);
 
-		UnitSystService unitSystService = SpringUtils.getBean(UnitSystService.class);
-		unitSystService.processStart();
+			VdsStatBatchServerController batchServerController = SpringUtils.getBean(VdsStatBatchServerController.class);
+			batchServerController.run(startStr, endStr);
 
-		applicationConfig.setStartSchedule(true);
+			int exitCode = SpringApplication.exit(context, () -> 0);
+			System.exit(exitCode);
+		}
+		else {
+			UnitSystService unitSystService = SpringUtils.getBean(UnitSystService.class);
+			unitSystService.processStart();
 
+			applicationConfig.setStartSchedule(true);
+		}
 		Runtime.getRuntime().addShutdownHook(new Thread(() -> {
 			log.error("on shutdown hook.");
-            applicationConfig.setStartSchedule(false);
+			applicationConfig.setStartSchedule(false);
 			terminateApplication();
 		}));
 	}

+ 87 - 0
src/main/java/com/its/vds/stat/server/controller/VdsStatBatchServerController.java

@@ -0,0 +1,87 @@
+package com.its.vds.stat.server.controller;
+
+import com.its.vds.stat.server.service.VdsStatServerService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Slf4j
+@Controller
+@RequiredArgsConstructor
+public class VdsStatBatchServerController {
+
+    private final VdsStatServerService service;
+
+    public void run(String startDtStr, String endDtStr) {
+
+        log.info("Start Batch Job: {} ~ {}", startDtStr, endDtStr);
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        LocalDateTime start = LocalDateTime.parse(startDtStr, formatter);
+        LocalDateTime end = LocalDateTime.parse(endDtStr, formatter);
+
+        while (!start.isAfter(end)) {
+            // 문자열 변환
+            String startStr = start.format(formatter);
+            String plus5Str = start.plusMinutes(5).format(formatter);
+            String plus5Minus1Str = start.plusMinutes(5).minusSeconds(1).format(formatter);
+
+            log.info("------------------------------------------------------------");
+            log.info("05MIN: {}, {}", startStr, plus5Minus1Str);
+
+            int hour = start.getHour();
+            int minute = start.getMinute();
+            int day = start.getDayOfMonth();
+            int month = start.getMonthValue();
+
+            int result = 0;
+            String start05MinFrom= start.plusMinutes(-5).format(formatter);
+            String start05MinTo= start.minusSeconds(1).format(formatter);
+            this.service.delVdsDtctHs(start05MinFrom);
+            result = this.service.crtVdsDtctHs(start05MinFrom, start05MinFrom, start05MinTo);
+            log.info(" 5MIN: {}, {}, {} EA.", start05MinFrom, start05MinTo, result);
+
+            if (minute % 15 == 0) {
+                String start15MinFrom= start.plusMinutes(-15).format(formatter);
+                String start15MinTo= start.minusSeconds(1).format(formatter);
+                this.service.delVdsDtct15MinStat(start05MinFrom);
+                result = this.service.crtVdsDtct15MinStat(start15MinFrom, start15MinFrom, start15MinTo);
+                log.info("15MIN: {}, {}, {} EA.", start15MinFrom, start15MinTo, result);
+            }
+
+            if (minute == 0) {
+                String startHourFrom= start.plusMinutes(-60).format(formatter);
+                String startHourTo= start.minusSeconds(1).format(formatter);
+                this.service.delVdsDtctHhStat(startHourFrom);
+                result = this.service.crtVdsDtctHhStat(startHourFrom, startHourFrom, startHourTo);
+                log.info(" HOUR: {}, {}, {} EA.", startHourFrom, startHourTo, result);
+            }
+
+
+            if (hour == 0 && minute == 0) {
+                String startDayFrom = start.minusDays(1).format(formatter);
+                String startDayTo   = start.minusSeconds(1).format(formatter);
+                this.service.delVdsDtctDdStat(startDayFrom);
+                result = this.service.crtVdsDtctDdStat(startDayFrom, startDayFrom, startDayTo);
+                log.info("  DAY: {}, {}, {} EA.", startDayFrom, startDayTo, result);
+
+                String startMonthFrom = start.minusMonths(1).withDayOfMonth(1).format(formatter);
+                String startMonthTo   = start.minusSeconds(1).format(formatter);
+                result = this.service.crtVdsDtctMnStat(startMonthFrom, startMonthFrom, startMonthTo);
+                log.info("MONTH: {}, {}, {} EA.", startMonthFrom, startMonthTo, result);
+
+//                int lastYear = start.getYear() - 1;
+//                String statYearFrom = String.format("%d0101000000", lastYear);
+//                String statYearTo   = String.format("%d1231235959", lastYear);
+//                log.info(" YEAR: {}, {}", statYearFrom, statYearTo);
+            }
+
+            // 5분 증가
+            start = start.plusMinutes(5);
+        }
+        log.info("=========================================================");
+    }
+}

+ 5 - 0
src/main/java/com/its/vds/stat/server/dao/mapper/VdsStatMapper.java

@@ -7,6 +7,11 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface VdsStatMapper {
 
+    int delVdsDtctHs(@Param("obj") VdsStatTimeDto obj);
+    int delVdsDtct15MinStat(@Param("obj") VdsStatTimeDto obj);
+    int delVdsDtctHhStat(@Param("obj") VdsStatTimeDto obj);
+    int delVdsDtctDdStat(@Param("obj") VdsStatTimeDto obj);
+
     int crtVdsDtctHs(@Param("obj") VdsStatTimeDto obj);
     int crtVdsDtct15MinStat(@Param("obj") VdsStatTimeDto obj);
     int crtVdsDtctHhStat(@Param("obj") VdsStatTimeDto obj);

+ 20 - 0
src/main/java/com/its/vds/stat/server/dao/repository/VdsStatRepository.java

@@ -11,6 +11,26 @@ import org.springframework.stereotype.Repository;
 public class VdsStatRepository {
 
     private final VdsStatMapper mapper;
+    @SqlOperation(type = SqlOperation.SqlType.DELETE, table = "TB_VDS_DTCT_HS")
+    public int delVdsDtctHs(VdsStatTimeDto obj) {
+        return this.mapper.delVdsDtctHs(obj);
+    }
+
+    @SqlOperation(type = SqlOperation.SqlType.DELETE, table = "TB_VDS_DTCT_15M_STAT")
+    public int delVdsDtct15MinStat(VdsStatTimeDto obj) {
+        return this.mapper.delVdsDtct15MinStat(obj);
+    }
+
+    @SqlOperation(type = SqlOperation.SqlType.DELETE, table = "TB_VDS_DTCT_HH_STAT")
+    public int delVdsDtctHhStat(VdsStatTimeDto obj) {
+        return this.mapper.delVdsDtctHhStat(obj);
+    }
+
+    @SqlOperation(type = SqlOperation.SqlType.DELETE, table = "TB_VDS_DTCT_DD_STAT")
+    public int delVdsDtctDdStat(VdsStatTimeDto obj) {
+        return this.mapper.delVdsDtctDdStat(obj);
+    }
+
 
     @SqlOperation(type = SqlOperation.SqlType.INSERT, table = "TB_VDS_DTCT_HS")
     public int crtVdsDtctHs(VdsStatTimeDto obj) {

+ 36 - 6
src/main/java/com/its/vds/stat/server/service/VdsStatServerService.java

@@ -19,44 +19,74 @@ public class VdsStatServerService {
 
     private final VdsStatRepository repo;
 
+    @ProcessingElapsed(type="05MIN", name="VDS 5분 통계", starting = false)
+    public int delVdsDtctHs(String statDt) {
+//        log.info("delVdsDtctHs: statDt: {}", statDt);
+        VdsStatTimeDto statTime = new VdsStatTimeDto(statDt, statDt, statDt);
+        return this.repo.delVdsDtctHs(statTime);
+    }
+
+    @ProcessingElapsed(type="05MIN", name="VDS 15분 통계", starting = false)
+    public int delVdsDtct15MinStat(String statDt) {
+//        log.info("delVdsDtct15MinStat: statDt: {}", statDt);
+        VdsStatTimeDto statTime = new VdsStatTimeDto(statDt, statDt, statDt);
+        return this.repo.delVdsDtct15MinStat(statTime);
+    }
+
+    @ProcessingElapsed(type="05MIN", name="VDS 1시간 통계", starting = false)
+    public int delVdsDtctHhStat(String statDt) {
+//        log.info("delVdsDtctHhStat: statDt: {}", statDt);
+        VdsStatTimeDto statTime = new VdsStatTimeDto(statDt, statDt, statDt);
+        return this.repo.delVdsDtctHhStat(statTime);
+    }
+
+    @ProcessingElapsed(type="05MIN", name="VDS 일 통계", starting = false)
+    public int delVdsDtctDdStat(String statDt) {
+//        log.info("delVdsDtctDdStat: statDt: {}", statDt);
+        VdsStatTimeDto statTime = new VdsStatTimeDto(statDt, statDt, statDt);
+        return this.repo.delVdsDtctDdStat(statTime);
+    }
+
+
+
     @ProcessingElapsed(type="05MIN", name="VDS 5분 통계", starting = false)
     public int crtVdsDtctHs(String statDt, String fromDt, String toDt) {
-        log.info("crtVdsDtctHs: currDt: {} statDt: {}, fromDt: {}, toDt: {}", statDt, fromDt, toDt, TimeUtils.getCurrentTimeString());
+        log.info("crtVdsDtctHs: currDt: {} statDt: {}, fromDt: {}, toDt: {}", TimeUtils.getCurrentTimeString(), statDt, fromDt, toDt);
         VdsStatTimeDto statTime = new VdsStatTimeDto(statDt, fromDt, toDt);
         return this.repo.crtVdsDtctHs(statTime);
     }
 
     @ProcessingElapsed(type="05MIN", name="VDS 15분 통계", starting = false)
     public int crtVdsDtct15MinStat(String statDt, String fromDt, String toDt) {
-        log.info("crtVdsDtct15MinStat: currDt: {} statDt: {}, fromDt: {}, toDt: {}", statDt, fromDt, toDt, TimeUtils.getCurrentTimeString());
+        log.info("crtVdsDtct15MinStat: currDt: {} statDt: {}, fromDt: {}, toDt: {}", TimeUtils.getCurrentTimeString(), statDt, fromDt, toDt);
         VdsStatTimeDto statTime = new VdsStatTimeDto(statDt, fromDt, toDt);
         return this.repo.crtVdsDtct15MinStat(statTime);
     }
 
     @ProcessingElapsed(type="05MIN", name="VDS 1시간 통계", starting = false)
     public int crtVdsDtctHhStat(String statDt, String fromDt, String toDt) {
-        log.info("crtVdsDtctHhStat: currDt: {} statDt: {}, fromDt: {}, toDt: {}", statDt, fromDt, toDt, TimeUtils.getCurrentTimeString());
+        log.info("crtVdsDtctHhStat: currDt: {} statDt: {}, fromDt: {}, toDt: {}", TimeUtils.getCurrentTimeString(), statDt, fromDt, toDt);
         VdsStatTimeDto statTime = new VdsStatTimeDto(statDt, fromDt, toDt);
         return this.repo.crtVdsDtctHhStat(statTime);
     }
 
     @ProcessingElapsed(type="05MIN", name="VDS 일 통계", starting = false)
     public int crtVdsDtctDdStat(String statDt, String fromDt, String toDt) {
-        log.info("crtVdsDtctDdStat: currDt: {} statDt: {}, fromDt: {}, toDt: {}", statDt, fromDt, toDt, TimeUtils.getCurrentTimeString());
+        log.info("crtVdsDtctDdStat: currDt: {} statDt: {}, fromDt: {}, toDt: {}", TimeUtils.getCurrentTimeString(), statDt, fromDt, toDt);
         VdsStatTimeDto statTime = new VdsStatTimeDto(statDt, fromDt, toDt);
         return this.repo.crtVdsDtctDdStat(statTime);
     }
 
     @ProcessingElapsed(type="05MIN", name="VDS 월 통계", starting = false)
     public int crtVdsDtctMnStat(String statDt, String fromDt, String toDt) {
-        log.info("crtVdsDtctMnStat: currDt: {} statDt: {}, fromDt: {}, toDt: {}", statDt, fromDt, toDt, TimeUtils.getCurrentTimeString());
+        log.info("crtVdsDtctMnStat: currDt: {} statDt: {}, fromDt: {}, toDt: {}", TimeUtils.getCurrentTimeString(), statDt, fromDt, toDt);
         VdsStatTimeDto statTime = new VdsStatTimeDto(statDt, fromDt, toDt);
         return this.repo.crtVdsDtctMnStat(statTime);
     }
 
     @ProcessingElapsed(type="05MIN", name="VDS 년 통계", starting = false)
     public int crtVdsDtctYyStat(String statDt, String fromDt, String toDt) {
-        log.info("crtVdsDtctYyStat: currDt: {} statDt: {}, fromDt: {}, toDt: {}", statDt, fromDt, toDt, TimeUtils.getCurrentTimeString());
+        log.info("crtVdsDtctYyStat: currDt: {} statDt: {}, fromDt: {}, toDt: {}", TimeUtils.getCurrentTimeString(), statDt, fromDt, toDt);
         VdsStatTimeDto statTime = new VdsStatTimeDto(statDt, fromDt, toDt);
         return this.repo.crtVdsDtctYyStat(statTime);
     }

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

@@ -3,9 +3,9 @@ spring:
     name: vds-stat-server
   profiles:
     active: prod
-  config:
-    import:
-      - optional:file:${user.dir}/conf/vds-stat-server.yml
+#  config:
+#    import:
+#      - optional:file:${user.dir}/conf/vds-stat-server.yml
   main:
 #    web-application-type: none
     log-startup-info: true
@@ -88,7 +88,7 @@ spring:
     activate:
       on-profile: prod
     import:
-      - optional:file:${user.dir}/conf/vds-stat-server-prod.yml
+      - optional:file:${user.dir}/conf/vds-stat-server.yml
   datasource:
     hikari:
       driver-class-name: com.tmax.tibero.jdbc.TbDriver

+ 24 - 0
src/main/resources/mybatis/mapper/VdsStatMapper.xml

@@ -3,6 +3,11 @@
 
 <mapper namespace="com.its.vds.stat.server.dao.mapper.VdsStatMapper">
 
+    <delete id="delVdsDtctHs" parameterType="com.its.vds.stat.server.dto.VdsStatTimeDto">
+        DELETE TB_VDS_DTCT_HS
+        WHERE PRCN_DT = #{obj.STAT_DT}
+    </delete>
+
     <insert id="crtVdsDtctHs" parameterType="com.its.vds.stat.server.dto.VdsStatTimeDto">
         INSERT INTO TB_VDS_DTCT_HS (
             PRCN_DT,
@@ -27,9 +32,16 @@
             ROUND(AVG(SPCE_AVRG_SPED), 0)
         FROM TB_VDS_DTCT_CLCT
         WHERE CLCT_DT BETWEEN #{obj.FROM_DT} AND #{obj.TO_DT}
+          AND TFVL > 0
+          AND SPED > 0
         GROUP BY VDS_DTCT_NMBR
     </insert>
 
+    <delete id="delVdsDtct15MinStat" parameterType="com.its.vds.stat.server.dto.VdsStatTimeDto">
+        DELETE TB_VDS_DTCT_15M_STAT
+        WHERE STAT_DT = #{obj.STAT_DT}
+    </delete>
+
     <insert id="crtVdsDtct15MinStat" parameterType="com.its.vds.stat.server.dto.VdsStatTimeDto">
         INSERT INTO TB_VDS_DTCT_15M_STAT (
             STAT_DT,
@@ -54,9 +66,16 @@
             ROUND(AVG(SPCE_AVRG_SPED), 0)
         FROM TB_VDS_DTCT_HS
         WHERE PRCN_DT BETWEEN #{obj.FROM_DT} AND #{obj.TO_DT}
+          AND TFVL > 0
+          AND SPED > 0
         GROUP BY VDS_DTCT_NMBR
     </insert>
 
+    <delete id="delVdsDtctHhStat" parameterType="com.its.vds.stat.server.dto.VdsStatTimeDto">
+        DELETE TB_VDS_DTCT_HH_STAT
+        WHERE STAT_DT = #{obj.STAT_DT}
+    </delete>
+
     <insert id="crtVdsDtctHhStat" parameterType="com.its.vds.stat.server.dto.VdsStatTimeDto">
         INSERT INTO TB_VDS_DTCT_HH_STAT (
             STAT_DT,
@@ -84,6 +103,11 @@
         GROUP BY VDS_DTCT_NMBR
     </insert>
 
+    <delete id="delVdsDtctDdStat" parameterType="com.its.vds.stat.server.dto.VdsStatTimeDto">
+        DELETE TB_VDS_DTCT_DD_STAT
+        WHERE STAT_DT = #{obj.STAT_DT}
+    </delete>
+
     <insert id="crtVdsDtctDdStat" parameterType="com.its.vds.stat.server.dto.VdsStatTimeDto">
         INSERT INTO TB_VDS_DTCT_DD_STAT (
             STAT_DT,

BIN
vds-stat-server-0.0.1.jar