Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bc478ad4ed | |||
| 161a68a0a2 |
@@ -17,7 +17,7 @@ jobs:
|
|||||||
CATALINA_BASE: /prod/eapim/adminportal
|
CATALINA_BASE: /prod/eapim/adminportal
|
||||||
CATALINA_HOME: /prod/eapim/apache-tomcat-9.0.116
|
CATALINA_HOME: /prod/eapim/apache-tomcat-9.0.116
|
||||||
CATALINA_PID: /prod/eapim/adminportal/temp/catalina.pid
|
CATALINA_PID: /prod/eapim/adminportal/temp/catalina.pid
|
||||||
DEPLOY_HTTP_PORT: "30120"
|
DEPLOY_HTTP_PORT: "39120"
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: eapim-admin
|
working-directory: eapim-admin
|
||||||
@@ -89,7 +89,7 @@ jobs:
|
|||||||
cp eapim-admin/build/libs/eapim-admin.war "$DEPLOY_DIR/monitoring.war"
|
cp eapim-admin/build/libs/eapim-admin.war "$DEPLOY_DIR/monitoring.war"
|
||||||
ls -la "$DEPLOY_DIR"
|
ls -la "$DEPLOY_DIR"
|
||||||
|
|
||||||
- name: Start tomcat and readiness probe (timeout 180s)
|
- name: Start tomcat and readiness probe (timeout 300s)
|
||||||
working-directory: ${{ github.workspace }}
|
working-directory: ${{ github.workspace }}
|
||||||
run: |
|
run: |
|
||||||
LOG="$CATALINA_BASE/logs/catalina.$(date +%Y-%m-%d).log"
|
LOG="$CATALINA_BASE/logs/catalina.$(date +%Y-%m-%d).log"
|
||||||
@@ -99,14 +99,17 @@ jobs:
|
|||||||
# systemd 가 Tomcat 을 새 cgroup 으로 띄움 — runner step 종료와 무관하게 살아남음
|
# systemd 가 Tomcat 을 새 cgroup 으로 띄움 — runner step 종료와 무관하게 살아남음
|
||||||
systemctl --user start eapim-admin
|
systemctl --user start eapim-admin
|
||||||
|
|
||||||
DEADLINE=$(($(date +%s) + 180))
|
# /loginForm.do 는 GET 매핑(MainController#loginForm) → tomcat·webapp 양쪽 살아있으면 200
|
||||||
|
# /login.do 는 POST 처리 — GET 으로 probe 시 405/잘못된 응답 가능성 있어 회피
|
||||||
|
PROBE_URL="http://localhost:$DEPLOY_HTTP_PORT/monitoring/loginForm.do"
|
||||||
|
DEADLINE=$(($(date +%s) + 300))
|
||||||
STATUS=000
|
STATUS=000
|
||||||
while [ $(date +%s) -lt $DEADLINE ]; do
|
while [ $(date +%s) -lt $DEADLINE ]; do
|
||||||
STATUS=$(curl -sS -o /dev/null -w '%{http_code}' --max-time 3 \
|
STATUS=$(curl -sS -o /dev/null -w '%{http_code}' --max-time 3 \
|
||||||
"http://localhost:$DEPLOY_HTTP_PORT/monitoring/login.do" 2>/dev/null || echo "000")
|
"$PROBE_URL" 2>/dev/null || echo "000")
|
||||||
case "$STATUS" in
|
case "$STATUS" in
|
||||||
200|302|401)
|
200|302|401)
|
||||||
echo "Readiness OK (/monitoring/login.do HTTP $STATUS)"
|
echo "Readiness OK ($PROBE_URL HTTP $STATUS)"
|
||||||
break
|
break
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -122,8 +125,13 @@ jobs:
|
|||||||
case "$STATUS" in
|
case "$STATUS" in
|
||||||
200|302|401) ;;
|
200|302|401) ;;
|
||||||
*)
|
*)
|
||||||
echo "::error::Readiness probe failed within 180s (last HTTP status: $STATUS)"
|
echo "::error::Readiness probe failed within 300s (last HTTP status: $STATUS)"
|
||||||
[ -f "$LOG" ] && tail -c +$((BEFORE+1)) "$LOG" | tail -100
|
echo "--- last 300 lines of catalina log ---"
|
||||||
|
[ -f "$LOG" ] && tail -c +$((BEFORE+1)) "$LOG" | tail -300
|
||||||
|
echo "--- systemd unit status ---"
|
||||||
|
systemctl --user status eapim-admin --no-pager || true
|
||||||
|
echo "--- listening ports ---"
|
||||||
|
ss -tlnp 2>/dev/null | grep -E ":$DEPLOY_HTTP_PORT\b" || echo "(port $DEPLOY_HTTP_PORT 미점유)"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -15,4 +15,6 @@ public interface EMSScheduler {
|
|||||||
|
|
||||||
void deleteAndAddJob(Scheduler scheduler, String jobName) throws SchedulerException, ClassNotFoundException;
|
void deleteAndAddJob(Scheduler scheduler, String jobName) throws SchedulerException, ClassNotFoundException;
|
||||||
|
|
||||||
|
void reloadJob(String jobName) throws SchedulerException, ClassNotFoundException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,6 +120,32 @@ public class EMSSchedulerImpl implements EMSScheduler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reloadJob(String jobName) throws SchedulerException, ClassNotFoundException {
|
||||||
|
JobInfo jobInfo = jobInfoService.getById(jobName);
|
||||||
|
if (CLUSTERED.equals(jobInfo.getInstanceName())) {
|
||||||
|
reloadClusteredJob(jobInfo);
|
||||||
|
} else {
|
||||||
|
deleteAndAddJob(scheduler, jobInfo);
|
||||||
|
deleteJob(clusteredScheduler, jobName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reloadClusteredJob(JobInfo jobInfo) throws SchedulerException, ClassNotFoundException {
|
||||||
|
TriggerKey triggerKey = new TriggerKey(getTriggerName(jobInfo.getId()), Scheduler.DEFAULT_GROUP);
|
||||||
|
Trigger existing = clusteredScheduler.getTrigger(triggerKey);
|
||||||
|
if (existing != 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void deleteJob(Scheduler inScheduler, String jobNm) throws SchedulerException {
|
public void deleteJob(Scheduler inScheduler, String jobNm) throws SchedulerException {
|
||||||
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);
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ public class SchedulerManController extends BaseAnnotationController {
|
|||||||
@Qualifier("monitoringSyncAgent")
|
@Qualifier("monitoringSyncAgent")
|
||||||
private MonitoringSyncAgent monitoringSyncAgent;
|
private MonitoringSyncAgent monitoringSyncAgent;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private EMSScheduler emsScheduler;
|
||||||
|
|
||||||
@GetMapping(value = "/common/scheduler/schedulerMan.view")
|
@GetMapping(value = "/common/scheduler/schedulerMan.view")
|
||||||
public String viewList() {
|
public String viewList() {
|
||||||
return "/common/scheduler/schedulerMan";
|
return "/common/scheduler/schedulerMan";
|
||||||
@@ -96,6 +99,11 @@ public class SchedulerManController extends BaseAnnotationController {
|
|||||||
@PostMapping(value = "/common/scheduler/schedulerMan.json", params = "cmd=UPDATE")
|
@PostMapping(value = "/common/scheduler/schedulerMan.json", params = "cmd=UPDATE")
|
||||||
public ResponseEntity<Void> update(JobInfoUI jobInfoUI) {
|
public ResponseEntity<Void> update(JobInfoUI jobInfoUI) {
|
||||||
service.update(jobInfoUI);
|
service.update(jobInfoUI);
|
||||||
|
try {
|
||||||
|
emsScheduler.reloadJob(jobInfoUI.getId());
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("reloadJob error on current server", e);
|
||||||
|
}
|
||||||
syncReloadScheduler(jobInfoUI.getId());
|
syncReloadScheduler(jobInfoUI.getId());
|
||||||
return ResponseEntity.ok().build();
|
return ResponseEntity.ok().build();
|
||||||
}
|
}
|
||||||
@@ -115,7 +123,7 @@ public class SchedulerManController extends BaseAnnotationController {
|
|||||||
String url = "/monitoring/schedulerReload.do";
|
String url = "/monitoring/schedulerReload.do";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ret = monitoringSyncAgent.sync(url, paramMap);
|
ret = monitoringSyncAgent.targetSync(url, paramMap);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("syncReloadScheduler error", e);
|
logger.error("syncReloadScheduler error", e);
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
+12
-15
@@ -1,10 +1,10 @@
|
|||||||
package com.eactive.eai.rms.onl.common.controller;
|
package com.eactive.eai.rms.onl.common.controller;
|
||||||
|
|
||||||
import com.eactive.eai.rms.common.interceptor.InterceptorSkipController;
|
import java.util.HashMap;
|
||||||
import com.eactive.eai.rms.common.scheduler.EMSScheduler;
|
import java.util.Map;
|
||||||
import com.eactive.eai.rms.onl.manage.adapter.spcftmadapter.AdapterJobInfo;
|
|
||||||
import com.eactive.eai.rms.onl.manage.adapter.spcftmadapter.AdapterSchedulerUtil;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import com.eactive.eai.rms.onl.manage.adapter.spcftmadapter.SpcfTmAdapterDao;
|
|
||||||
import org.quartz.Scheduler;
|
import org.quartz.Scheduler;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -15,9 +15,11 @@ import org.springframework.stereotype.Controller;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import com.eactive.eai.rms.common.interceptor.InterceptorSkipController;
|
||||||
import java.util.HashMap;
|
import com.eactive.eai.rms.common.scheduler.EMSScheduler;
|
||||||
import java.util.Map;
|
import com.eactive.eai.rms.onl.manage.adapter.spcftmadapter.AdapterJobInfo;
|
||||||
|
import com.eactive.eai.rms.onl.manage.adapter.spcftmadapter.AdapterSchedulerUtil;
|
||||||
|
import com.eactive.eai.rms.onl.manage.adapter.spcftmadapter.SpcfTmAdapterDao;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
public class SchedulerReloadController implements InterceptorSkipController {
|
public class SchedulerReloadController implements InterceptorSkipController {
|
||||||
@@ -34,19 +36,14 @@ public class SchedulerReloadController implements InterceptorSkipController {
|
|||||||
private EMSScheduler emsScheduler;
|
private EMSScheduler emsScheduler;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@Qualifier("scheduler")
|
@Qualifier("scheduler")
|
||||||
private Scheduler scheduler;
|
private Scheduler scheduler;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("clusteredScheduler")
|
|
||||||
private Scheduler clusteredScheduler;
|
|
||||||
|
|
||||||
@RequestMapping("/schedulerReload.do")
|
@RequestMapping("/schedulerReload.do")
|
||||||
public ResponseEntity<Map<String, Object>> rmsSchedulerReload(String jobName) {
|
public ResponseEntity<Map<String, Object>> rmsSchedulerReload(String jobName) {
|
||||||
Map<String, Object> result = new HashMap<>();
|
Map<String, Object> result = new HashMap<>();
|
||||||
try {
|
try {
|
||||||
emsScheduler.deleteAndAddJob(scheduler, jobName);
|
emsScheduler.reloadJob(jobName);
|
||||||
emsScheduler.deleteAndAddJob(clusteredScheduler, jobName);
|
|
||||||
result.put("status", "success");
|
result.put("status", "success");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("", e);
|
logger.error("", e);
|
||||||
|
|||||||
Reference in New Issue
Block a user