package cn.dreampie.quartz;
import cn.dreampie.common.Plugin;
import cn.dreampie.common.util.properties.Proper;
import cn.dreampie.common.util.stream.Filer;
import cn.dreampie.log.Logger;
import cn.dreampie.orm.Metadata;
import cn.dreampie.quartz.exception.QuartzException;
import cn.dreampie.quartz.job.QuartzCronJob;
import cn.dreampie.quartz.job.QuartzOnceJob;
import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* Created by wangrenhui on 14-4-21.
*/
public class QuartzPlugin implements Plugin {
private static final Logger logger = Logger.getLogger(QuartzPlugin.class);
private static String dsmName;
private static boolean dsmAlone;
/**
* 默认配置文件*
*/
private String config = "quartz/quartz.properties";
private String jobs = "quartz/jobs.properties";
public QuartzPlugin() {
this(null);
}
public QuartzPlugin(String dsmName) {
this(null, null, dsmName, false);
}
public QuartzPlugin(String dsmName, boolean dsmAlone) {
this(null, null, dsmName, dsmAlone);
}
public QuartzPlugin(String config, String jobs) {
this(config, jobs, Metadata.getDefaultDsmName(), false);
}
public QuartzPlugin(String config, String jobs, String dsmName, boolean dsmAlone) {
if (config != null) {
this.config = config;
}
if (jobs != null) {
this.jobs = jobs;
}
if (dsmName != null) {
QuartzPlugin.dsmName = dsmName;
}
QuartzPlugin.dsmAlone = dsmAlone;
}
public static String getDsmName() {
return dsmName;
}
public static boolean isDsmAlone() {
return dsmAlone;
}
public boolean start() {
try {
//加载配置文件
Properties configProp = Proper.use(config).getProperties();
//实例化
Quartzer.setSchedulerFactory(new StdSchedulerFactory(configProp));
//获取Scheduler
Scheduler sched = Quartzer.getSchedulerFactory().getScheduler();
//内存,数据库的任务
sched.start();
//属性文件中的任务
startPropertiesJobs();
return true;
} catch (Exception e) {
throw new QuartzException("Can't start quartz plugin.", e);
}
}
public boolean stop() {
try {
Quartzer.getSchedulerFactory().getScheduler().shutdown();
Quartzer.setSchedulerFactory(null);
return true;
} catch (Exception e) {
throw new QuartzException("Can't stop quartz plugin.", e);
}
}
public void startPropertiesJobs() {
if (Filer.exist(jobs)) {
Properties jobsProp = Proper.use(jobs).getProperties();
Enumeration enums = jobsProp.keys();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<String> startedJobs = new ArrayList<String>();
String[] keyArr;
String key, jobName, jobClassKey, groupKey, cronKey, onceKey, enable, group, jobCron, jobOnce, jobClassName;
Class clazz;
Date onceTime;
while (enums.hasMoreElements()) {
key = enums.nextElement() + "";
if (!key.startsWith("job")) {
continue;
}
keyArr = key.split("\\.");
jobName = keyArr[1];
//已经启动过的任务
if (startedJobs.contains(jobName))
continue;
startedJobs.add(jobName);
jobClassKey = key.replace(keyArr[2], "class");
groupKey = key.replace(keyArr[2], "group");
cronKey = key.replace(keyArr[2], "cron");
onceKey = key.replace(keyArr[2], "once");
enable = key.replace(keyArr[2], "enable");
//判断任务是否启用
if (!Boolean.valueOf(jobsProp.getProperty(enable))) {
continue;
}
group = jobsProp.getProperty(groupKey);
jobCron = jobsProp.getProperty(cronKey);
jobOnce = jobsProp.getProperty(onceKey);
jobClassName = jobsProp.getProperty(jobClassKey);
try {
clazz = Class.forName(jobClassName);
} catch (ClassNotFoundException e) {
throw new QuartzException(e.getMessage(), e);
}
//启动任务
if (jobCron != null) {
if (group != null) {
new QuartzCronJob(group, keyArr[1], jobCron, clazz).start();
} else {
new QuartzCronJob(keyArr[1], jobCron, clazz).start();
}
} else if (jobOnce != null) {
try {
onceTime = sdf.parse(jobOnce);
} catch (ParseException e) {
throw new QuartzException(e.getMessage(), e);
}
if (System.currentTimeMillis() <= onceTime.getTime()) {
if (group != null) {
new QuartzOnceJob(group, keyArr[1], onceTime, clazz).start();
} else {
new QuartzOnceJob(keyArr[1], onceTime, clazz).start();
}
}
} else {
if (group != null) {
new QuartzOnceJob(group, keyArr[1], new Date(), clazz).start();
} else {
new QuartzOnceJob(keyArr[1], new Date(), clazz).start();
}
}
}
}
}
public String getConfig() {
return config;
}
public void setConfig(String config) {
this.config = config;
}
public String getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
}