/*******************************************************************************
* Copyright (c) 2014 hangum.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* hangum - initial API and implementation
******************************************************************************/
package com.hangum.tadpole.monitoring.core.manager.schedule;
import java.util.Date;
import org.apache.log4j.Logger;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.GroupMatcher;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine;
import com.hangum.tadpole.engine.query.dao.system.ScheduleMainDAO;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.monitoring.core.jobs.UserJOB;
import com.hangum.tadpole.monitoring.core.jobs.monitoring.MonitoringJob;
/**
* Schedule Manager
*
* @author hangum
*
*/
public class ScheduleManager {
private static final Logger logger = Logger.getLogger(ScheduleManager.class);
private static ScheduleManager manager = null;
private static Scheduler scheduler = null;
private ScheduleManager() {}
public static ScheduleManager getInstance() {
if(manager == null) {
manager = new ScheduleManager();
try {
scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
// // 기 등록된 job들을 등록해줍니다.
// List<ScheduleMainDAO> listSchedule = TadpoleSystem_Schedule.findAllScheduleMain();
// for (ScheduleMainDAO scheduleMainDao : listSchedule) {
// UserDBDAO userDB = TadpoleSystem_UserDBQuery.getUserDBInstance(scheduleMainDao.getDb_seq());
// manager.newJob(userDB, scheduleMainDao);
// }
// Add monitoring job
manager.newMonitoringJob();
} catch (SchedulerException e) {
logger.error("Schedule initialize exception", e);
} catch(Exception e) {
logger.error("find schedule", e);
}
}
return manager;
}
/**
* add monitoring job
*/
public Date newMonitoringJob() throws Exception {
Date firstJob = new Date();
String strJobKey = "MainMonitoringJob";//makeJobkey(userDB, scheduleMainDao);
JobDetail job = JobBuilder.newJob(MonitoringJob.class).withIdentity(strJobKey).build();
Trigger trigger = TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * 1/1 * ? *"))//*/10 * * * * ?"))
.build();
try {
firstJob = scheduler.scheduleJob(job, trigger);
} catch(Exception e) {
logger.error("execute summary reporter", e);
throw e;
}
return firstJob;
}
/**
* remove job
*
* @param userDB
* @param scheduleMainDao
* @return
*/
public boolean deleteJob(final UserDBDAO userDB, final ScheduleMainDAO scheduleMainDao) {
boolean isRemove = true;
String strKey = makeJobkey(userDB, scheduleMainDao);
try {
manager.scheduler.deleteJob(new JobKey(strKey));
} catch (SchedulerException e) {
logger.error("delete job", e);
isRemove = false;
}
return isRemove;
}
/**
* find job
*
* @param strJobName
* @return
*/
public boolean findJob(final UserDBDAO userDB, final ScheduleMainDAO scheduleMainDao) {
String strJobKey = makeJobkey(userDB, scheduleMainDao);
try {
for (String groupName : scheduler.getJobGroupNames()) {
for(JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {
String jobName = jobKey.getName();
if(jobName.equals(strJobKey)) return true;
}
}
} catch(Exception e) {
logger.error("find job", e);
}
return false;
}
/**
* add job
*
* @param userDB
* @param scheduleMainDao
*/
public Date newJob(final UserDBDAO userDB, final ScheduleMainDAO scheduleMainDao) throws Exception {
Date firstJob = new Date();
logger.info("## New Job: db info " + userDB.getSeq()+"("+userDB.getDisplay_name() + "), job name is " + scheduleMainDao.getTitle() + "{" + scheduleMainDao.getCron_exp() + "}");
String strJobKey = makeJobkey(userDB, scheduleMainDao);
JobDetail job = JobBuilder.newJob(UserJOB.class).withIdentity(strJobKey).build();
Trigger trigger = TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule(scheduleMainDao.getCron_exp()))
.build();
try {
firstJob = scheduler.scheduleJob(job, trigger);
} catch(Exception e) {
logger.error("execute summary reporter", e);
throw e;
}
return firstJob;
}
/**
* make job key
* @param userDB
* @param scheduleMainDao
* @return
*/
private String makeJobkey(final UserDBDAO userDB, final ScheduleMainDAO scheduleMainDao) {
return userDB.getSeq() + PublicTadpoleDefine.DELIMITER + scheduleMainDao.getSeq() + PublicTadpoleDefine.DELIMITER + userDB.getDisplay_name() + scheduleMainDao.getTitle();
}
public void stopSchedule() {
if(scheduler != null) {
try {
scheduler.shutdown(true);
Thread.sleep(1000);
} catch (Exception e) {
logger.error("Shutdown Schedule", e);
}
}
}
}