package cn.dreampie.quartz.job;
import cn.dreampie.common.util.Maper;
import cn.dreampie.quartz.QuartzKey;
import cn.dreampie.quartz.Quartzer;
import cn.dreampie.quartz.exception.QuartzException;
import org.quartz.*;
import java.util.Date;
import java.util.Map;
import static org.quartz.JobBuilder.newJob;
/**
* Created by wangrenhui on 14/11/29.
*/
public abstract class QuartzJob {
protected static final String TRIGGER_MARK = "trigger";
protected static final String GROUP_MARK = "group";
protected static final String JOB_MARK = "job";
protected static final String SEPARATOR = "_";
protected QuartzKey quartzKey;
protected Class<? extends Job> jobClass;
protected Date scheduleTime;
protected Map<String, Object> params = Maper.of();
/**
* 启动任务
*/
public void start() {
start(false);
}
/**
* 强制启动任务
*
* @param force 是否强制启动,true 表示 如果存在相同的key值的任务时,停止任务,强制执行新任务
*/
public abstract void start(boolean force);
/**
* 停止任务
*/
public void stop() {
long id = quartzKey.getId();
String name = quartzKey.getName();
String group = quartzKey.getGroup();
SchedulerFactory factory = Quartzer.getSchedulerFactory();
try {
if (factory != null) {
Scheduler scheduler = factory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_MARK + SEPARATOR + name + SEPARATOR + id, GROUP_MARK + SEPARATOR + group + SEPARATOR + id);
Trigger trigger = scheduler.getTrigger(triggerKey);
if (trigger != null) {
scheduler.pauseTrigger(triggerKey);
scheduler.unscheduleJob(triggerKey);
scheduler.deleteJob(trigger.getJobKey());
Quartzer.removeQuartzJob(this);
}
}
} catch (Exception e) {
throw new QuartzException("Can't stop job.", e);
}
}
/**
* 暂停任务
*/
public void pause() {
long id = quartzKey.getId();
String name = quartzKey.getName();
String group = quartzKey.getGroup();
SchedulerFactory factory = Quartzer.getSchedulerFactory();
try {
if (factory != null) {
Scheduler scheduler = factory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_MARK + SEPARATOR + name + SEPARATOR + id, GROUP_MARK + SEPARATOR + group + SEPARATOR + id);
Trigger trigger = scheduler.getTrigger(triggerKey);
if (trigger != null) {
scheduler.pauseTrigger(triggerKey);
}
}
} catch (Exception e) {
throw new QuartzException("Can't pause job.", e);
}
}
/**
* 恢复任务
*/
public void resume() {
long id = quartzKey.getId();
String name = quartzKey.getName();
String group = quartzKey.getGroup();
SchedulerFactory factory = Quartzer.getSchedulerFactory();
try {
if (factory != null) {
Scheduler scheduler = factory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_MARK + SEPARATOR + name + SEPARATOR + id, GROUP_MARK + SEPARATOR + group + SEPARATOR + id);
Trigger trigger = scheduler.getTrigger(triggerKey);
if (trigger != null) {
scheduler.resumeJob(trigger.getJobKey());
}
}
} catch (Exception e) {
throw new QuartzException("Can't resume job.", e);
}
}
public Trigger.TriggerState getState() {
long id = quartzKey.getId();
String name = quartzKey.getName();
String group = quartzKey.getGroup();
SchedulerFactory factory = Quartzer.getSchedulerFactory();
Trigger.TriggerState triggerState = null;
try {
if (factory != null) {
Scheduler scheduler = factory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_MARK + SEPARATOR + name + SEPARATOR + id, GROUP_MARK + SEPARATOR + group + SEPARATOR + id);
triggerState = scheduler.getTriggerState(triggerKey);
}
} catch (Exception e) {
throw new QuartzException("Can't get job state.", e);
}
return triggerState;
}
protected JobDetail getJobDetail(long id, String name, String group) {
// define the job and tie it to our HelloJob class
JobDetail job = newJob(jobClass)
.withIdentity(JOB_MARK + SEPARATOR + name + SEPARATOR + id, GROUP_MARK + SEPARATOR + group + SEPARATOR + id)
.requestRecovery()
.build();
JobDataMap jobMap = job.getJobDataMap();
jobMap.put("job_group", group);
jobMap.put("job_name", name);
jobMap.put("job_id", id);
//添加参数
if (params != null && params.size() > 0) {
jobMap.putAll(params);
}
return job;
}
public QuartzKey getQuartzKey() {
return quartzKey;
}
public void setQuartzKey(QuartzKey quartzKey) {
this.quartzKey = quartzKey;
}
public Class<? extends Job> getJobClass() {
return jobClass;
}
public void setJobClass(Class<? extends Job> jobClass) {
this.jobClass = jobClass;
}
public Map<String, Object> getParams() {
return params;
}
public void setParams(Map<String, Object> params) {
this.params = params;
}
public Date getScheduleTime() {
return scheduleTime;
}
public void setScheduleTime(Date scheduleTime) {
this.scheduleTime = scheduleTime;
}
public QuartzJob addParam(String key, Object value) {
this.params.put(key, value);
return this;
}
public QuartzJob addParams(Map<String, Object> values) {
this.params.putAll(values);
return this;
}
}