* @throws ParseException 当格式化日期时间有异常则抛出此异常
*/
private void checkHeartbeat() throws SQLException, ParseException{
boolean ready = true; // 任务启动标志
Schedule schedule = config.getSchedule(); // 当前调度器对象
StringBuilder aliveSchedule = new StringBuilder();
/* 获取所有的调度器 */
List<ScheduleInfo> scheduleList = QueryHelper.query(ScheduleInfo.class,
"SELECT id,schedulename,seqno,registertime,updatetime,status " +
"FROM jd_ofc_schedule(NOLOCK) " +
"ORDER BY id", new Object[]{});
if (scheduleList == null || scheduleList.size() == 0){
log.error("The schedule heart error!");
return;
}
/* 检测存活的调度器 */
String curTime = TimerUtil.getDbTime(); // 数据库当前时间
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<ScheduleInfo> aliveList = new ArrayList<ScheduleInfo>();
for (ScheduleInfo scheduleInfo : scheduleList) {
// 如果时间差小于超时时间,则判断为该调度器正常
long timeDiff = sdf.parse(curTime).getTime() - sdf.parse(scheduleInfo.getUpdatetime()).getTime();
if (timeDiff < config.getHeartTimeout()) {
aliveList.add(scheduleInfo);
aliveSchedule.append(scheduleInfo.getId());
aliveSchedule.append(";");
if (Schedule.PAUSED != scheduleInfo.getStatus() && ready) {
ready = false;
}
}
}
log.debug("aliveList size : {"+aliveList.size()
+"} , start : {"+ready
+"} , scheduleNum : {"+config.getScheduleNum()
+"} , aliveSchedule = "+config.getAliveSchedule()
+" , curAliveSchedule = "+aliveSchedule.toString());
/* 如果存活调度器有变化,则暂停调度器任务处理 */
if (!aliveSchedule.toString().equals(config.getAliveSchedule())
&& Schedule.RUNNING == schedule.getStatus()) {
abortTask(schedule);
}
/* 如果调度器就绪,则重新分配任务 */
if (ready) {