From 3250da7347e616e9636d0096d7985b049fa170bf Mon Sep 17 00:00:00 2001 From: htlee Date: Sat, 21 Feb 2026 00:42:28 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20L2=20=EC=9B=8C=EB=B0=8D=EC=97=85=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=20=ED=99=95=EC=9E=A5=20=E2=80=94=20Daily=20J?= =?UTF-8?q?ob=20=EC=A0=84=20=EA=B8=B0=EB=8F=99=20=EC=8B=9C=20=EC=96=B4?= =?UTF-8?q?=EC=A0=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=ED=8F=AC=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 00:00~01:00 기동: 어제 00:00 ~ 현재 정각 (Daily Job용) 01:00 이후 기동: 오늘 00:00 ~ 현재 정각 (기존 동작) Co-Authored-By: Claude Opus 4.6 --- .../global/config/CacheWarmupService.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/gc/mda/signal_batch/global/config/CacheWarmupService.java b/src/main/java/gc/mda/signal_batch/global/config/CacheWarmupService.java index 28efd5b..b4d61f3 100644 --- a/src/main/java/gc/mda/signal_batch/global/config/CacheWarmupService.java +++ b/src/main/java/gc/mda/signal_batch/global/config/CacheWarmupService.java @@ -68,6 +68,10 @@ public class CacheWarmupService { LocalDateTime currentHour = now.withMinute(0).withSecond(0).withNano(0); LocalDateTime todayStart = now.toLocalDate().atStartOfDay(); + // Daily Job(01:00) 이전 기동 시 어제 데이터도 L2에 필요 + boolean beforeDailyJob = now.getHour() < 1; + LocalDateTime l2Start_time = beforeDailyJob ? todayStart.minusDays(1) : todayStart; + // 1. L1 워밍업: 현재 시간대 5min 트랙 (예: 12:00~12:50) long l1Start = System.currentTimeMillis(); try { @@ -77,10 +81,10 @@ public class CacheWarmupService { } long l1Elapsed = System.currentTimeMillis() - l1Start; - // 2. L2 워밍업: 오늘 정각 이전 hourly 트랙 (예: 00:00~12:00) + // 2. L2 워밍업: 00:00~01:00 기동 시 어제+오늘, 이후는 오늘만 long l2Start = System.currentTimeMillis(); try { - warmUpHourlyCache(todayStart, currentHour); + warmUpHourlyCache(l2Start_time, currentHour); } catch (Exception e) { log.error("[CACHE-MONITOR] L2(hourly) 워밍업 실패 — 계속 진행: {}", e.getMessage()); } @@ -123,12 +127,13 @@ public class CacheWarmupService { } /** - * L2 워밍업: t_vessel_tracks_hourly에서 오늘 정각 이전 DB 로드 - * 예: 12:54 기동 → 00:00~12:00 (최대 12건/MMSI) 로드 + * L2 워밍업: t_vessel_tracks_hourly에서 DB 로드 + * - 01:00 이후 기동: 오늘 00:00 ~ 현재 정각 (최대 24건/MMSI) + * - 00:00~01:00 기동: 어제 00:00 ~ 현재 정각 (Daily Job용 어제 데이터 포함) */ - private void warmUpHourlyCache(LocalDateTime todayStart, LocalDateTime currentHour) { - if (!currentHour.isAfter(todayStart)) { - log.info("[CACHE-MONITOR] L2 워밍업: 자정 직후 — 건너뜀"); + private void warmUpHourlyCache(LocalDateTime rangeStart, LocalDateTime currentHour) { + if (!currentHour.isAfter(rangeStart)) { + log.info("[CACHE-MONITOR] L2 워밍업: 범위 없음 [{}, {}) — 건너뜀", rangeStart, currentHour); return; } @@ -138,15 +143,15 @@ public class CacheWarmupService { "FROM signal.t_vessel_tracks_hourly " + "WHERE time_bucket >= ? AND time_bucket < ?"; - List tracks = loadVesselTracksFromDb(sql, todayStart, currentHour); + List tracks = loadVesselTracksFromDb(sql, rangeStart, currentHour); if (!tracks.isEmpty()) { long distinctMmsi = tracks.stream().map(VesselTrack::getMmsi).distinct().count(); hourlyTrackCache.putAll(tracks); log.info("[CACHE-MONITOR] L2 워밍업 완료: [{}, {}) → {} 건, {} MMSI, cacheSize={}", - todayStart, currentHour, tracks.size(), distinctMmsi, hourlyTrackCache.size()); + rangeStart, currentHour, tracks.size(), distinctMmsi, hourlyTrackCache.size()); } else { log.info("[CACHE-MONITOR] L2 워밍업: [{}, {}) → 데이터 없음 (정상)", - todayStart, currentHour); + rangeStart, currentHour); } } -- 2.45.2