diff --git a/WebContent/jsp/onl/kjb/statistics/apiUseStatsMan.jsp b/WebContent/jsp/onl/kjb/statistics/apiUseStatsMan.jsp index e948408..8e6fa56 100644 --- a/WebContent/jsp/onl/kjb/statistics/apiUseStatsMan.jsp +++ b/WebContent/jsp/onl/kjb/statistics/apiUseStatsMan.jsp @@ -222,7 +222,7 @@ $("input[name=searchStartDate], input[name=searchEndDate]").datepicker(); var today = getToday(); - var startDate = today; + var startDate = today.substring(0,6)+"01"; var endDate = today; @@ -234,6 +234,7 @@ } list(); + search(); resizeJqGridWidth('grid', 'content_middle', '1200'); diff --git a/src/main/java/com/eactive/eai/rms/common/scheduler/EMSSchedulerImpl.java b/src/main/java/com/eactive/eai/rms/common/scheduler/EMSSchedulerImpl.java index 8e58f77..929f5ea 100644 --- a/src/main/java/com/eactive/eai/rms/common/scheduler/EMSSchedulerImpl.java +++ b/src/main/java/com/eactive/eai/rms/common/scheduler/EMSSchedulerImpl.java @@ -124,6 +124,7 @@ public class EMSSchedulerImpl implements EMSScheduler { public void reloadJob(String jobName) throws SchedulerException, ClassNotFoundException { JobInfo jobInfo = jobInfoService.getById(jobName); if (CLUSTERED.equals(jobInfo.getInstanceName())) { + deleteJob(scheduler, jobName); reloadClusteredJob(jobInfo); } else { deleteAndAddJob(scheduler, jobInfo); @@ -132,26 +133,44 @@ public class EMSSchedulerImpl implements EMSScheduler { } private void reloadClusteredJob(JobInfo jobInfo) throws SchedulerException, ClassNotFoundException { - TriggerKey triggerKey = new TriggerKey(getTriggerName(jobInfo.getId()), Scheduler.DEFAULT_GROUP); + String jobId = jobInfo.getId(); + TriggerKey triggerKey = new TriggerKey(getTriggerName(jobId), Scheduler.DEFAULT_GROUP); + JobKey jobKey = new JobKey(jobId, Scheduler.DEFAULT_GROUP); + Trigger existing = clusteredScheduler.getTrigger(triggerKey); - if (existing != null) { + JobDetail existingJob = clusteredScheduler.getJobDetail(jobKey); + log.info("[reloadClusteredJob] {} - existingTrigger={}, existingJob={}", jobId, + existing != null ? existing.getKey() : "null", + existingJob != null ? existingJob.getKey() : "null"); + + if (existing != null && existingJob != null) { CronTrigger newTrigger = newTrigger() .withIdentity(triggerKey) .withSchedule(cronSchedule(jobInfo.getCronExp())) .build(); Date ft = clusteredScheduler.rescheduleJob(triggerKey, newTrigger); - log.info("{} rescheduled at: {} cron: {}", jobInfo.getId(), ft, jobInfo.getCronExp()); - } else { - deleteAndAddJob(clusteredScheduler, jobInfo); + if (ft != null) { + log.info("[reloadClusteredJob] {} rescheduled at: {} cron: {}", jobId, ft, jobInfo.getCronExp()); + return; + } + log.warn("[reloadClusteredJob] {} rescheduleJob returned null, falling back to deleteAndAddJob", jobId); + } else if (existing != null) { + // orphaned trigger (job missing) — clean up before re-adding + log.warn("[reloadClusteredJob] {} has orphaned trigger without job, unscheduling", jobId); + clusteredScheduler.unscheduleJob(triggerKey); } + log.info("[reloadClusteredJob] {} calling deleteAndAddJob on clusteredScheduler", jobId); + deleteAndAddJob(clusteredScheduler, jobInfo); } public void deleteJob(Scheduler inScheduler, String jobNm) throws SchedulerException { + String schedulerType = (inScheduler == clusteredScheduler) ? "clusteredScheduler" : "scheduler"; JobKey key = new JobKey(jobNm, Scheduler.DEFAULT_GROUP); JobDetail jobDetail = inScheduler.getJobDetail(key); + log.info("[deleteJob] {} from {} — found={}", jobNm, schedulerType, jobDetail != null); if (jobDetail != null) { inScheduler.deleteJob(key); - log.info(jobNm + " has been scheduled to deleted"); + log.info("[deleteJob] {} deleted from {}", jobNm, schedulerType); } } @@ -160,8 +179,12 @@ public class EMSSchedulerImpl implements EMSScheduler { if (StringUtils.equalsIgnoreCase(info.getUseYn(), "Y") && StringUtils.equalsAnyIgnoreCase(info.getInstanceName(), "ALL", "CLUSTERED", ContainerUtil.getInstanceName())) { + String schedulerType = (inScheduler == clusteredScheduler) ? "clusteredScheduler" : "scheduler"; + log.info("[addJob] {} → {}, class={}, cron={}", info.getId(), schedulerType, info.getJobClassName(), info.getCronExp()); + @SuppressWarnings("unchecked") Class jobClass = (Class) Class.forName(info.getJobClassName()); + log.info("[addJob] {} class loaded: {}", info.getId(), jobClass.getName()); JobBuilder jobBuilder = newJob(jobClass); jobBuilder = jobBuilder.withIdentity(info.getId(), Scheduler.DEFAULT_GROUP); @@ -177,11 +200,13 @@ public class EMSSchedulerImpl implements EMSScheduler { .withSchedule(cronSchedule(info.getCronExp())) .build(); + log.info("[addJob] {} calling scheduleJob...", info.getId()); Date ft = inScheduler.scheduleJob(job, trigger); - log - .info("{} has been scheduled to run at: {} and repeat based on expression: {}", job.getKey(), ft, - trigger.getCronExpression()); - } + log.info("[addJob] {} scheduled at: {} cron: {}", job.getKey(), ft, trigger.getCronExpression()); + } else { + log.info("[addJob] {} skipped — useYn={}, instanceName={}, currentInstance={}", + info.getId(), info.getUseYn(), info.getInstanceName(), ContainerUtil.getInstanceName()); + } } } diff --git a/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusService.java b/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusService.java index 55615ad..2d80baf 100644 --- a/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusService.java +++ b/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusService.java @@ -26,10 +26,10 @@ public class ApiStatusService { @Autowired private ApiStatusRepository apiStatusRepository; - + @Autowired - private UmsManager ums; - + private UmsManager ums; + @Autowired private ApiStatusDetectionService apiStatusDectionService; @@ -55,7 +55,8 @@ public class ApiStatusService { apiStatus.setEaisvcname(event.getEaisvcname()); apiStatus.setStatusCode(newStatusCode); - apiStatusRepository.save(apiStatus); // PK 있으면 UPDATE, 없으면 INSERT + apiStatusRepository.saveAndFlush(apiStatus); // PK 있으면 UPDATE, 없으면 INSERT (즉시 flush) + log.debug("API 상태 변경: {}-{} {} → {}", event.getEaisvcname(), event.getEaisvcdesc(), event.getEvent(), newStatusCode); diff --git a/src/main/java/com/eactive/eai/rms/ext/djb/statistics/ApiUseStatsService.java b/src/main/java/com/eactive/eai/rms/ext/djb/statistics/ApiUseStatsService.java index 067b71f..7e6fc01 100644 --- a/src/main/java/com/eactive/eai/rms/ext/djb/statistics/ApiUseStatsService.java +++ b/src/main/java/com/eactive/eai/rms/ext/djb/statistics/ApiUseStatsService.java @@ -85,7 +85,7 @@ public class ApiUseStatsService + " ORDER BY ORGNAME"; } else if ("API".equals(search.getSearchType())) { dataSql = "SELECT COUNT(*) OVER () AS RECORDS " - + ", C.EAISVCDESC" + + ", A.API_NAME" + ", SUM(A.TOTAL_CNT)" + ", SUM(A.SUCCESS_CNT)" + ", CASE WHEN SUM(A.TOTAL_CNT) > 0 THEN SUM(A.SUCCESS_CNT) * 100 / SUM(A.TOTAL_CNT) ELSE NULL END" @@ -99,8 +99,8 @@ public class ApiUseStatsService + " LEFT OUTER JOIN TSEAIAU01 B ON A.CLIENT_ID = B.CLIENTID" + " LEFT OUTER JOIN TSEAIHE01 C ON A.API_NAME = C.EAISVCNAME " + where - + " GROUP BY C.EAISVCDESC" - + " ORDER BY EAISVCDESC"; + + " GROUP BY A.API_NAME" + + " ORDER BY API_NAME"; } else if ("DATE".equals(search.getSearchType())) { dataSql = "SELECT COUNT(*) OVER () AS RECORDS " + ", TO_CHAR(STAT_TIME,'YYYY-MM-DD') AS STAT_TIME "