@@ -222,7 +222,7 @@
|
|||||||
$("input[name=searchStartDate], input[name=searchEndDate]").datepicker();
|
$("input[name=searchStartDate], input[name=searchEndDate]").datepicker();
|
||||||
|
|
||||||
var today = getToday();
|
var today = getToday();
|
||||||
var startDate = today;
|
var startDate = today.substring(0,6)+"01";
|
||||||
var endDate = today;
|
var endDate = today;
|
||||||
|
|
||||||
|
|
||||||
@@ -234,6 +234,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
list();
|
list();
|
||||||
|
search();
|
||||||
|
|
||||||
resizeJqGridWidth('grid', 'content_middle', '1200');
|
resizeJqGridWidth('grid', 'content_middle', '1200');
|
||||||
|
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ public class EMSSchedulerImpl implements EMSScheduler {
|
|||||||
public void reloadJob(String jobName) throws SchedulerException, ClassNotFoundException {
|
public void reloadJob(String jobName) throws SchedulerException, ClassNotFoundException {
|
||||||
JobInfo jobInfo = jobInfoService.getById(jobName);
|
JobInfo jobInfo = jobInfoService.getById(jobName);
|
||||||
if (CLUSTERED.equals(jobInfo.getInstanceName())) {
|
if (CLUSTERED.equals(jobInfo.getInstanceName())) {
|
||||||
|
deleteJob(scheduler, jobName);
|
||||||
reloadClusteredJob(jobInfo);
|
reloadClusteredJob(jobInfo);
|
||||||
} else {
|
} else {
|
||||||
deleteAndAddJob(scheduler, jobInfo);
|
deleteAndAddJob(scheduler, jobInfo);
|
||||||
@@ -132,26 +133,44 @@ public class EMSSchedulerImpl implements EMSScheduler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void reloadClusteredJob(JobInfo jobInfo) throws SchedulerException, ClassNotFoundException {
|
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);
|
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()
|
CronTrigger newTrigger = newTrigger()
|
||||||
.withIdentity(triggerKey)
|
.withIdentity(triggerKey)
|
||||||
.withSchedule(cronSchedule(jobInfo.getCronExp()))
|
.withSchedule(cronSchedule(jobInfo.getCronExp()))
|
||||||
.build();
|
.build();
|
||||||
Date ft = clusteredScheduler.rescheduleJob(triggerKey, newTrigger);
|
Date ft = clusteredScheduler.rescheduleJob(triggerKey, newTrigger);
|
||||||
log.info("{} rescheduled at: {} cron: {}", jobInfo.getId(), ft, jobInfo.getCronExp());
|
if (ft != null) {
|
||||||
} else {
|
log.info("[reloadClusteredJob] {} rescheduled at: {} cron: {}", jobId, ft, jobInfo.getCronExp());
|
||||||
deleteAndAddJob(clusteredScheduler, jobInfo);
|
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 {
|
public void deleteJob(Scheduler inScheduler, String jobNm) throws SchedulerException {
|
||||||
|
String schedulerType = (inScheduler == clusteredScheduler) ? "clusteredScheduler" : "scheduler";
|
||||||
JobKey key = new JobKey(jobNm, Scheduler.DEFAULT_GROUP);
|
JobKey key = new JobKey(jobNm, Scheduler.DEFAULT_GROUP);
|
||||||
JobDetail jobDetail = inScheduler.getJobDetail(key);
|
JobDetail jobDetail = inScheduler.getJobDetail(key);
|
||||||
|
log.info("[deleteJob] {} from {} — found={}", jobNm, schedulerType, jobDetail != null);
|
||||||
if (jobDetail != null) {
|
if (jobDetail != null) {
|
||||||
inScheduler.deleteJob(key);
|
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")
|
if (StringUtils.equalsIgnoreCase(info.getUseYn(), "Y")
|
||||||
&& StringUtils.equalsAnyIgnoreCase(info.getInstanceName(), "ALL", "CLUSTERED", ContainerUtil.getInstanceName())) {
|
&& 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")
|
@SuppressWarnings("unchecked")
|
||||||
Class<Job> jobClass = (Class<Job>) Class.forName(info.getJobClassName());
|
Class<Job> jobClass = (Class<Job>) Class.forName(info.getJobClassName());
|
||||||
|
log.info("[addJob] {} class loaded: {}", info.getId(), jobClass.getName());
|
||||||
|
|
||||||
JobBuilder jobBuilder = newJob(jobClass);
|
JobBuilder jobBuilder = newJob(jobClass);
|
||||||
jobBuilder = jobBuilder.withIdentity(info.getId(), Scheduler.DEFAULT_GROUP);
|
jobBuilder = jobBuilder.withIdentity(info.getId(), Scheduler.DEFAULT_GROUP);
|
||||||
@@ -177,11 +200,13 @@ public class EMSSchedulerImpl implements EMSScheduler {
|
|||||||
.withSchedule(cronSchedule(info.getCronExp()))
|
.withSchedule(cronSchedule(info.getCronExp()))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
log.info("[addJob] {} calling scheduleJob...", info.getId());
|
||||||
Date ft = inScheduler.scheduleJob(job, trigger);
|
Date ft = inScheduler.scheduleJob(job, trigger);
|
||||||
log
|
log.info("[addJob] {} scheduled at: {} cron: {}", job.getKey(), ft, trigger.getCronExpression());
|
||||||
.info("{} has been scheduled to run at: {} and repeat based on expression: {}", job.getKey(), ft,
|
} else {
|
||||||
trigger.getCronExpression());
|
log.info("[addJob] {} skipped — useYn={}, instanceName={}, currentInstance={}",
|
||||||
}
|
info.getId(), info.getUseYn(), info.getInstanceName(), ContainerUtil.getInstanceName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ public class ApiStatusService {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ApiStatusRepository apiStatusRepository;
|
private ApiStatusRepository apiStatusRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UmsManager ums;
|
private UmsManager ums;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ApiStatusDetectionService apiStatusDectionService;
|
private ApiStatusDetectionService apiStatusDectionService;
|
||||||
|
|
||||||
@@ -55,7 +55,8 @@ public class ApiStatusService {
|
|||||||
apiStatus.setEaisvcname(event.getEaisvcname());
|
apiStatus.setEaisvcname(event.getEaisvcname());
|
||||||
apiStatus.setStatusCode(newStatusCode);
|
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);
|
log.debug("API 상태 변경: {}-{} {} → {}", event.getEaisvcname(), event.getEaisvcdesc(), event.getEvent(), newStatusCode);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public class ApiUseStatsService
|
|||||||
+ " ORDER BY ORGNAME";
|
+ " ORDER BY ORGNAME";
|
||||||
} else if ("API".equals(search.getSearchType())) {
|
} else if ("API".equals(search.getSearchType())) {
|
||||||
dataSql = "SELECT COUNT(*) OVER () AS RECORDS "
|
dataSql = "SELECT COUNT(*) OVER () AS RECORDS "
|
||||||
+ ", C.EAISVCDESC"
|
+ ", A.API_NAME"
|
||||||
+ ", SUM(A.TOTAL_CNT)"
|
+ ", SUM(A.TOTAL_CNT)"
|
||||||
+ ", SUM(A.SUCCESS_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"
|
+ ", 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 TSEAIAU01 B ON A.CLIENT_ID = B.CLIENTID"
|
||||||
+ " LEFT OUTER JOIN TSEAIHE01 C ON A.API_NAME = C.EAISVCNAME "
|
+ " LEFT OUTER JOIN TSEAIHE01 C ON A.API_NAME = C.EAISVCNAME "
|
||||||
+ where
|
+ where
|
||||||
+ " GROUP BY C.EAISVCDESC"
|
+ " GROUP BY A.API_NAME"
|
||||||
+ " ORDER BY EAISVCDESC";
|
+ " ORDER BY API_NAME";
|
||||||
} else if ("DATE".equals(search.getSearchType())) {
|
} else if ("DATE".equals(search.getSearchType())) {
|
||||||
dataSql = "SELECT COUNT(*) OVER () AS RECORDS "
|
dataSql = "SELECT COUNT(*) OVER () AS RECORDS "
|
||||||
+ ", TO_CHAR(STAT_TIME,'YYYY-MM-DD') AS STAT_TIME "
|
+ ", TO_CHAR(STAT_TIME,'YYYY-MM-DD') AS STAT_TIME "
|
||||||
|
|||||||
Reference in New Issue
Block a user