package org.toobs.framework.scheduler;
import java.text.ParseException;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.toobs.framework.management.MemoryMonitor;
import org.toobs.framework.util.Configuration;
public class AppScheduler implements BeanFactoryAware {
private BeanFactory beanFactory;
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
private static Log log = LogFactory.getLog(AppScheduler.class);
private Scheduler scheduler = null;
private MemoryMonitor memMon = null;
private List appSchedules;
public AppScheduler(){
}
public void init() {
try {
SchedulerFactory sf = new StdSchedulerFactory();
scheduler = sf.getScheduler();
Iterator iter = appSchedules.iterator();
while (iter.hasNext()) {
AppScheduleInfo appInfo = (AppScheduleInfo)iter.next();
try {
JobDetail job = new JobDetail(appInfo.getJobName(), appInfo.getGroupName(), java.lang.Class.forName(appInfo.getJobClass()));
String jobSchedule = appInfo.getJobSchedule();
String jobSchedOvr = Configuration.getInstance().getProperty(appInfo.getJobEnvCronProperty());
if (jobSchedOvr != null && jobSchedOvr.length() > 0) {
jobSchedule = jobSchedOvr;
}
CronTrigger trigger = new CronTrigger("Trigger-" + appInfo.getJobName(), "Trigger-" + appInfo.getGroupName(),
appInfo.getJobName(), appInfo.getGroupName(), jobSchedule);
scheduler.addJob(job, true);
Date ft = scheduler.scheduleJob(trigger);
log.info("Job " + job.getName() + " will next run at " + ft.toString());
} catch (ClassNotFoundException e) {
log.error("Job " + appInfo.getJobName() + " class " + appInfo.getJobClass() + " not found");
}
}
scheduler.start();
memMon = MemoryMonitor.getInstance();
} catch (ParseException e) {
log.error("ParseException in AppScheduler " + e.getMessage(), e);
} catch (SchedulerException e) {
log.error("SchedulerException in AppScheduler " + e.getMessage(), e);
}
}
public void destroy() {
try {
scheduler.shutdown();
Iterator iter = appSchedules.iterator();
while (iter.hasNext()) {
AppScheduleInfo appInfo = (AppScheduleInfo)iter.next();
ScheduledJob job = (ScheduledJob)beanFactory.getBean(appInfo.getJobName());
job.shutdown();
}
} catch (SchedulerException e) {
log.error("SchedulerException in AppScheduler during shutdown " + e.getMessage(), e);
}
}
public List getAppSchedules() {
return appSchedules;
}
public void setAppSchedules(List appSchedules) {
this.appSchedules = appSchedules;
}
}