From a45ecedc93c51288a14e6112f49b053420df6ef8 Mon Sep 17 00:00:00 2001 From: ggun12 Date: Tue, 19 Mar 2024 15:04:00 +0900 Subject: [PATCH] * EX 매칭은 순차 실행으로 처리 --- src/main/java/com/batch/config/MatchingExtraProcessorAuto.java | 6 ++++-- src/main/java/com/batch/controller/JobController.java | 55 ++++++++++++++++++++++++++++++++++++++----------------- src/main/java/com/batch/service/JobService.java | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------- src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ 4 files changed, 263 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/batch/config/MatchingExtraProcessorAuto.java b/src/main/java/com/batch/config/MatchingExtraProcessorAuto.java index 3a0d4b2..2faafef 100644 --- a/src/main/java/com/batch/config/MatchingExtraProcessorAuto.java +++ b/src/main/java/com/batch/config/MatchingExtraProcessorAuto.java @@ -9,6 +9,8 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import org.springframework.batch.core.configuration.annotation.StepScope; + import com.batch.mapper.primary.MatchingInnerDelingMapper; import com.batch.util.StatisticsUtil; @@ -22,7 +24,7 @@ public class MatchingExtraProcessorAuto { private final MatchingInnerDelingMapper matchingInnerDelingMapper; @SuppressWarnings("unchecked") - public void process(Map paramRec, int iCmbnOwnCnt, int iCmbnTranCnt, int iStartOwn, int iStartTran) throws Exception { + public void process(Map paramRec, int iCmbnOwnCnt, int iCmbnTranCnt, int iStartOwn, int iStartTran, int mtchNumber) throws Exception { //Job Create Log UUID uuid = UUID.randomUUID(); @@ -130,7 +132,6 @@ public class MatchingExtraProcessorAuto { //비교 lMatchingDataOne vs mMatchingDataTwo List lMatchingResultUpdate = new ArrayList(); //업데이트할 대상 - int mtchNumber = 0; String mtchSys = "AUTO"; String mtchType = "EX_" + iCmbnOwnCnt + "_" + iCmbnTranCnt; String mtchTypeName = "자기(" + iCmbnOwnCnt + "건Sum), 상대(" + iCmbnTranCnt + "건Sum), ("+sDelngCrncy+"), 비교(금액)"; @@ -230,6 +231,7 @@ public class MatchingExtraProcessorAuto { } log.debug("Updated OrgData : " + iUpdated + "건"); + //작업종료에 대한 로그 업데이트 paramLog.put("exit_code", "0"); paramLog.put("exit_message", ""); diff --git a/src/main/java/com/batch/controller/JobController.java b/src/main/java/com/batch/controller/JobController.java index 319d671..bf4e6f6 100644 --- a/src/main/java/com/batch/controller/JobController.java +++ b/src/main/java/com/batch/controller/JobController.java @@ -7,6 +7,8 @@ import java.util.Map; import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -102,12 +104,14 @@ public class JobController { * "searchTwo": "dta_ty in ('11','21','31','33','35','37','41')" * } */ + //Job Create Log UUID uuid = UUID.randomUUID(); String sJobGroup = uuid.toString(); - log.debug("Start Extra Matching Job"); - List retData = matchingInnerDelingMapper.getCustomItemReadData(params); + +// log.debug("Start Extra Matching Job"); +// List retData = matchingInnerDelingMapper.getCustomItemReadData(params); // List retData = new ArrayList(); // Map m = new HashMap(); // m.put("sys_se", "LS_ALL"); @@ -117,22 +121,39 @@ public class JobController { // m.put("searchOne", "dta_ty in ('11','21','41')"); // m.put("searchTwo", "dta_ty in ('12','22','42')"); // retData.add(m); - // 수익/비용 - for(Map curMap : retData) { - curMap.put("conds", "T"); - log.info("Start extraJobSub Transaction !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - jobService.extraJobSub(sJobGroup, curMap); - log.info("End extraJobSub Transaction !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - } - //채권/채무 - for(Map curMap : retData) { - curMap.put("conds", "B"); - log.info("Start extraJobSub Balance !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - jobService.extraJobSub(sJobGroup, curMap); - log.info("End extraJobSub Balance !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - } - log.debug("End Extra Matching Job"); + /** extraJobSub start ************************************************************************************** */ +// List retData = matchingInnerDelingMapper.getCustomItemReadData(params); +// +// int mtchNumber = 0; +// // 수익/비용 +// for(Map curMap : retData) { +// curMap.put("conds", "T"); +// log.info("Start extraJobSub Transaction !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); +// jobService.extraJobSub(sJobGroup, curMap, mtchNumber); +// log.info("End extraJobSub Transaction !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); +// } +// //채권/채무 +// for(Map curMap : retData) { +// curMap.put("conds", "B"); +// log.info("Start extraJobSub Balance !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); +// jobService.extraJobSub(sJobGroup, curMap, mtchNumber); +// log.info("End extraJobSub Balance !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); +// } + /** extraJobSub end ************************************************************************************** */ + + + + /** extraJobSub2 start ************************************************************************************** */ + long startTime = System.currentTimeMillis(); + log.info("### Start Extra Matching Job : "+startTime); + jobService.extraJobSub2(sJobGroup, params); + + long endTime = System.currentTimeMillis(); + log.info("### End Extra Matching Job : "+endTime); + /** extraJobSub2 end ************************************************************************************** */ + + Map rtnMap = new HashMap(); rtnMap.put("jobGroupId", sJobGroup); diff --git a/src/main/java/com/batch/service/JobService.java b/src/main/java/com/batch/service/JobService.java index 28469ae..ad170b3 100644 --- a/src/main/java/com/batch/service/JobService.java +++ b/src/main/java/com/batch/service/JobService.java @@ -24,6 +24,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Transactional; import org.zeroturnaround.exec.ProcessExecutor; import org.zeroturnaround.exec.stream.LogOutputStream; @@ -121,10 +123,14 @@ public class JobService { } + + + @SuppressWarnings("rawtypes") @Async("extAsync") - public void extraJobSub(String jobGroupId, Map paramRec) throws Exception { - + public void extraJobSub(String jobGroupId, Map paramRec, int key) throws Exception { + + int mtchNumber = key; //Job Create Log UUID uuid = UUID.randomUUID(); HashMap mt = new HashMap(); @@ -135,36 +141,37 @@ public class JobService { paramLog.put("user_job_group", jobGroupId); paramLog.put("user_job_id", sDate); paramLog.put("user_job_name", "Extra매칭(" + paramRec.toString() + ")"); - matchingInnerDelingMapper.createUserJob(paramLog); + matchingInnerDelingMapper.createUserJob(paramLog); + String sThreadName = Thread.currentThread().getName(); long startTime = System.currentTimeMillis(); - log.info("extra [" + sThreadName + "]Job Started : " + startTime + "]params=" + paramRec.toString()); + log.info("extra [" + sThreadName + " : "+sDate+"]Job Started : " + startTime + "]params=" + paramRec.toString()); log.debug("extra [" + sThreadName + "]params=" + paramRec.toString()); MatchingExtraProcessorAuto matchingExtraProcessorAuto = new MatchingExtraProcessorAuto(matchingInnerDelingMapper); //2건씩 합산 매칭일 경우 최대 20000건 까지 for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 1, 2, 0, i); + matchingExtraProcessorAuto.process(paramRec, 1, 2, 0, i, mtchNumber); } for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 2, 1, i, 0); + matchingExtraProcessorAuto.process(paramRec, 2, 1, i, 0, mtchNumber); } for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 2, 2, i, i); + matchingExtraProcessorAuto.process(paramRec, 2, 2, i, i, mtchNumber); } //3건씩 매칭일 경우 최대 5000건 까지 for (int i=0; i<2000;i=i+100) { - matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i); + matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i, mtchNumber); } for (int i=0; i<2000;i=i+100) { - matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0); + matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0, mtchNumber); } long endTime = System.currentTimeMillis(); - log.info("extra [" + sThreadName + "]Job Ended: " + endTime); + log.info("extra [" + sThreadName + " : "+sDate+"]Job Ended: " + endTime); log.info("extra [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); //작업종료에 대한 로그 업데이트 @@ -172,6 +179,129 @@ public class JobService { paramLog.put("exit_message", ""); matchingInnerDelingMapper.finishUserJob(paramLog); + } + + + @SuppressWarnings("rawtypes") + @Async("extAsync") + public void extraJobSub2(String jobGroupId, Map paramRec) throws Exception { + + + List retData = matchingInnerDelingMapper.getCustomItemReadData(paramRec); + + int mtchNumber = 0; + paramRec.put("conds", "T"); + for(Map curMap : retData) { + paramRec.putAll(curMap); + //Job Create Log + UUID uuid = UUID.randomUUID(); + HashMap mt = new HashMap(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); + + Map paramLog = new HashMap(); + paramLog.put("user_job_group", jobGroupId); + paramLog.put("user_job_id", sDate); + paramLog.put("user_job_name", "Extra매칭(" + paramRec.toString() + ")"); + try { + matchingInnerDelingMapper.createUserJob(paramLog); + }catch(Exception e) { + log.info("createUserJob Exception : "+e.getMessage()); + } + String sThreadName = Thread.currentThread().getName(); + long startTime = System.currentTimeMillis(); + log.info("extra [" + sThreadName + " : "+sDate+"]Job Started : " + startTime + "]params=" + paramRec.toString()); + log.debug("extra [" + sThreadName + "]params=" + paramRec.toString()); + + MatchingExtraProcessorAuto matchingExtraProcessorAuto = new MatchingExtraProcessorAuto(matchingInnerDelingMapper); + + //2건씩 합산 매칭일 경우 최대 20000건 까지 + for (int i=0; i<20000;i=i+1000) { + matchingExtraProcessorAuto.process(paramRec, 1, 2, 0, i, mtchNumber); + } + for (int i=0; i<20000;i=i+1000) { + matchingExtraProcessorAuto.process(paramRec, 2, 1, i, 0, mtchNumber); + } + for (int i=0; i<20000;i=i+1000) { + matchingExtraProcessorAuto.process(paramRec, 2, 2, i, i, mtchNumber); + } + + //3건씩 매칭일 경우 최대 5000건 까지 + for (int i=0; i<2000;i=i+100) { + matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i, mtchNumber); + } + for (int i=0; i<2000;i=i+100) { + matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0, mtchNumber); + } + + long endTime = System.currentTimeMillis(); + log.info("extra [" + sThreadName + " : "+sDate+"]Job Ended: " + endTime); + log.info("extra [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); + + //작업종료에 대한 로그 업데이트 + paramLog.put("exit_code", "0"); + paramLog.put("exit_message", ""); + matchingInnerDelingMapper.finishUserJob(paramLog); + + } + + + paramRec.put("conds", "B"); + for(Map curMap : retData) { + paramRec.putAll(curMap); + + //Job Create Log + UUID uuid = UUID.randomUUID(); + HashMap mt = new HashMap(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); + + Map paramLog = new HashMap(); + paramLog.put("user_job_group", jobGroupId); + paramLog.put("user_job_id", sDate); + paramLog.put("user_job_name", "Extra매칭(" + paramRec.toString() + ")"); + try { + matchingInnerDelingMapper.createUserJob(paramLog); + }catch(Exception e) { + log.info("createUserJob Exception : "+e.getMessage()); + } + String sThreadName = Thread.currentThread().getName(); + long startTime = System.currentTimeMillis(); + log.info("extra [" + sThreadName + " : "+sDate+"]Job Started : " + startTime + "]params=" + paramRec.toString()); + log.debug("extra [" + sThreadName + "]params=" + paramRec.toString()); + + MatchingExtraProcessorAuto matchingExtraProcessorAuto = new MatchingExtraProcessorAuto(matchingInnerDelingMapper); + + //2건씩 합산 매칭일 경우 최대 20000건 까지 + for (int i=0; i<20000;i=i+1000) { + matchingExtraProcessorAuto.process(paramRec, 1, 2, 0, i, mtchNumber); + } + for (int i=0; i<20000;i=i+1000) { + matchingExtraProcessorAuto.process(paramRec, 2, 1, i, 0, mtchNumber); + } + for (int i=0; i<20000;i=i+1000) { + matchingExtraProcessorAuto.process(paramRec, 2, 2, i, i, mtchNumber); + } + + //3건씩 매칭일 경우 최대 5000건 까지 + for (int i=0; i<2000;i=i+100) { + matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i, mtchNumber); + } + for (int i=0; i<2000;i=i+100) { + matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0, mtchNumber); + } + + long endTime = System.currentTimeMillis(); + log.info("extra [" + sThreadName + " : "+sDate+"]Job Ended: " + endTime); + log.info("extra [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); + + //작업종료에 대한 로그 업데이트 + paramLog.put("exit_code", "0"); + paramLog.put("exit_message", ""); + matchingInnerDelingMapper.finishUserJob(paramLog); + + } + } @SuppressWarnings("rawtypes") @@ -367,4 +497,6 @@ public class JobService { matchingInnerDelingMapper.finishUserJob(paramLog); } + + } diff --git a/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml b/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml index a2bb5a5..16739be 100644 --- a/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml +++ b/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml @@ -26,6 +26,7 @@ and accnut_ym = #{accnutYm} and mtch_ty is null and dta_ty in ('11','21','31','33','35','37','41') + and delng_amt != 0 GROUP BY sys_se , accnut_ym @@ -47,6 +48,7 @@ and accnut_ym = #{accnutYm} and mtch_ty is null and dta_ty in ('12','22','32','34','36','38','42') + and delng_amt != 0 GROUP BY sys_se , accnut_ym @@ -516,18 +518,83 @@ -- libgit2 0.21.4