diff --git a/src/main/java/com/interplug/qcast/batch/JobLauncherController.java b/src/main/java/com/interplug/qcast/batch/JobLauncherController.java index 0dac1462..4d1503e7 100644 --- a/src/main/java/com/interplug/qcast/batch/JobLauncherController.java +++ b/src/main/java/com/interplug/qcast/batch/JobLauncherController.java @@ -280,12 +280,60 @@ public class JobLauncherController { return "Job already running"; } - JobParameters jobParameters = - new JobParametersBuilder().addDate("time", new Date()).toJobParameters(); +// JobParameters jobParameters = +// new JobParametersBuilder().addDate("time", new Date()).toJobParameters(); +// +// jobLauncher.run(job, jobParameters); +// +// return jobName+ " executed successfully"; - jobLauncher.run(job, jobParameters); + // 재시도 로직 추가 + int maxRetries = 3; + int retryCount = 0; + long initialDelay = 60000; // 1분 - return jobName+ " executed successfully"; + while (retryCount < maxRetries) { + try { + JobParameters jobParameters = new JobParametersBuilder() + .addString("jobName", jobName) + .addDate("time", new Date()) + .addLong("run.id", System.currentTimeMillis()) + .toJobParameters(); + + log.info("Job {} 실행 시도 (재시도 {}/{})", jobName, retryCount + 1, maxRetries); + JobExecution jobExecution = jobLauncher.run(job, jobParameters); + + log.info("Job {} 완료 상태: {}", jobName, jobExecution.getExitStatus().getExitCode()); + return jobName + " executed successfully"; + + } catch (Exception e) { + retryCount++; + + // 데드락 오류인지 확인 + boolean isDeadlock = e.getCause() != null && + e.getCause().getMessage() != null && + e.getCause().getMessage().toLowerCase().contains("deadlock"); + + if (isDeadlock && retryCount < maxRetries) { + long delay = initialDelay * retryCount; // 1분, 2분, 3분 증가 + log.warn("Job {} 실행 중 데드락 발생. {}/{} 재시도 ({}ms 후 재시도)...", + jobName, retryCount, maxRetries, delay, e); + + try { + Thread.sleep(delay); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + log.error("Job {} 재시도 중 인터럽트 발생", jobName, ie); + return "Job " + jobName + " interrupted during retry"; + } + } else { + log.error("Job {} 실행 실패 (재시도 {}/{})", jobName, retryCount, maxRetries, e); + return "Error executing job " + jobName + ": " + e.getMessage(); + } + } + } + + return "Job " + jobName + " failed after " + maxRetries + " retries"; } /** diff --git a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java index d14645c9..e3d59025 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java @@ -1830,7 +1830,7 @@ public class EstimateService { // 추후 개발 (가대중량표) if (estimateRequest.getSchDrawingFlg().indexOf("4") < 0) { - safeRemoveSheet(workbook, "重量算"); + safeRemoveSheet(workbook, "重量算出シート"); safeRemoveSheet(workbook, "特異事項"); } @@ -1840,7 +1840,7 @@ public class EstimateService { safeRemoveSheet(workbook, "発電シミュレーション"); safeRemoveSheet(workbook, "割付図・系統図"); safeRemoveSheet(workbook, "架台図"); - safeRemoveSheet(workbook, "重量算"); + safeRemoveSheet(workbook, "重量算出シート"); }else{ safeRemoveSheet(workbook,"見積書."); safeRemoveSheet(workbook, "特異事項"); diff --git a/src/main/resources/mappers/estimate/estimateMapper.xml b/src/main/resources/mappers/estimate/estimateMapper.xml index ada431e7..0899fd55 100644 --- a/src/main/resources/mappers/estimate/estimateMapper.xml +++ b/src/main/resources/mappers/estimate/estimateMapper.xml @@ -404,7 +404,7 @@ ON PE.ITEM_ID = I.ITEM_ID WHERE P.OBJECT_NO = #{objectNo} AND P.PLAN_NO = #{planNo} - AND I.POWER_COM_FLG = '1' /* PCS 아이템만 */ + AND I.POWER_COM_FLG = '1' /* PCS 아이템만 */ ) T