From 043debba3314287202402e76d922f9d8e0cb2a71 Mon Sep 17 00:00:00 2001 From: Hyojin Ahn Date: Tue, 20 Jan 2026 08:18:18 -0500 Subject: [PATCH] [Scheduler] Implemented scheduler using config only --- .../com/goi/erp/entity/ScheduleJobConfig.java | 3 + .../goi/erp/service/SchedulerCoreService.java | 55 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/main/java/com/goi/erp/entity/ScheduleJobConfig.java b/src/main/java/com/goi/erp/entity/ScheduleJobConfig.java index 17fedfd..786df6f 100644 --- a/src/main/java/com/goi/erp/entity/ScheduleJobConfig.java +++ b/src/main/java/com/goi/erp/entity/ScheduleJobConfig.java @@ -48,6 +48,9 @@ public class ScheduleJobConfig { @Column(name = "sjc_job_code", nullable = false, length = 50) private String sjcJobCode; + + @Column(name = "sjc_next_job_code", nullable = false, length = 50) + private String sjcNextJobCode; @Column(name = "sjc_job_name", nullable = false, length = 100) private String sjcJobName; diff --git a/src/main/java/com/goi/erp/service/SchedulerCoreService.java b/src/main/java/com/goi/erp/service/SchedulerCoreService.java index b0d3286..da4d224 100644 --- a/src/main/java/com/goi/erp/service/SchedulerCoreService.java +++ b/src/main/java/com/goi/erp/service/SchedulerCoreService.java @@ -159,6 +159,9 @@ public class SchedulerCoreService { body.getSuccessCount(), body.getFailCount() ); + + // 연관된 다음 작업 바로 수행 + triggerNextJobIfExists(job, LocalDateTime.now()); } else { logService.markFailed( log.getSjlId(), @@ -211,6 +214,58 @@ public class SchedulerCoreService { return snapshot; } + + private void triggerNextJobIfExists(ScheduleJobConfig job, LocalDateTime now) { + + if (job.getSjcNextJobCode() == null) { + return; + } + + ScheduleJobConfig nextJob = + configRepository.findBySjcJobCode(job.getSjcNextJobCode()) + .orElse(null); + + if (nextJob == null || !Boolean.TRUE.equals(nextJob.getSjcEnabled())) { + return; + } + + log.info( + "Trigger chained job. from={} to={}", + job.getSjcJobCode(), + nextJob.getSjcJobCode() + ); + + // cron 판단 없이 바로 실행 + evaluateAndRunChained(nextJob, now); + } + + private void evaluateAndRunChained( + ScheduleJobConfig job, + LocalDateTime now + ) { + // 중복 실행 방지 + if (logService.isRunning(job.getSjcId())) { + log.info("Chained job already running. jobCode={}", job.getSjcJobCode()); + return; + } + + LocalDateTime from = now + .minusHours(job.getSjcLookbackHours() != null ? job.getSjcLookbackHours() : 0) + .minusMinutes(job.getSjcOverlapMinutes() != null ? job.getSjcOverlapMinutes() : 0); + + ScheduleJobLog runningLog = logService.createRunningLog( + job.getSjcId(), + now, + job.getSjcLookbackHours(), + job.getSjcOverlapMinutes(), + job.getSjcMaxRecords(), + "scheduler-chain" + ); + + executeWorker(job, from, now, runningLog); + } + + }