1.首先在Spring xml里定义
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
2.设置po类
public class TScheduleJob implements java.io.Serializable {
// Fields
private Integer FId;
private String FJobName;
private String FJobGroup;
private String FJobStatus;
private String FCronExpression;
private String FBeanClass;
private String FMethodName;
private String FSpringId;
private String FIsConcurrent;
private String FDescription;
private Integer FTimes;
private Timestamp FReateTime;
private Timestamp FUpdateTime;
//setter and getter
}
3.service类及其辅助类
@Service
@Qualifier("quatzService")
public class QuatzService implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
@Autowired
private TScheduleJobDAO TScheduleJobDAO;
public void getInit() throws Exception {
System.out.println("init.....................................................................");
// 这里从数据库中获取任务信息数据
// List<TScheduleJob> jobList = new ArrayList<TScheduleJob>();
// System.out.println("jobList size:" + jobList.size());
// TScheduleJob scheduleJob = new TScheduleJob();
// scheduleJob.setFBeanClass("com.landgent.service.logic.TimerLogicMgr");
// scheduleJob.setFCronExpression("0/30 ?");
// scheduleJob.setFJobGroup(Scheduler.DEFAULT_GROUP);
// scheduleJob.setFId(1);
// scheduleJob.setFJobName("updateYazhu");
// scheduleJob.setFJobStatus(Constant.QUARTZ_STATUS_RUNNING);
// scheduleJob.setFMethodName("updateYazhu");
// scheduleJob.setFSpringId("timerLogicMgr");
// jobList.add(scheduleJob);
@SuppressWarnings("unchecked")
List<TScheduleJob> jobList = TScheduleJobDAO.findAll();
System.out.println("jobList size:" + jobList.size());
for (TScheduleJob job : jobList) {
System.out.println("jobName:"+job.getFJobName());
addJob(job);
}
}
/**
* 添加任务
*
* @param TDbConfigQuartz
* @throws SchedulerException
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public void addJob(TScheduleJob job) throws SchedulerException {
if (job == null
|| !Constant.QUARTZ_STATUS_RUNNING.equals(job.getFJobStatus())) {
return;
}
Scheduler scheduler = schedulerFactoryBean.getScheduler();
String jobGroup = StringUtils.isBlank(job.getFJobGroup()) ? Scheduler.DEFAULT_GROUP
: job.getFJobGroup();
// log.debug(scheduler +
// ".......................................................................................add");
TriggerKey triggerKey = TriggerKey.triggerKey(job.getFJobName(),
jobGroup);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 不存在,创建一个
if (null == trigger) {
Class clazz = Constant.QUARTZ_CONCURRENT_IS.equals(job
.getFIsConcurrent()) ? QuartzJobFactory.class
: QuartzJobFactoryDisallowConcurrentExecution.class;
JobDetail jobDetail = JobBuilder.newJob(clazz)
.withIdentity(job.getFJobName(), jobGroup).build();
jobDetail.getJobDataMap().put("scheduleJob", job);
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(job.getFCronExpression());
trigger = TriggerBuilder.newTrigger()
.withIdentity(job.getFJobName(), jobGroup)
.withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
} else {
// Trigger已存在,那么更新相应的定时设置
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(job.getFCronExpression());
// 按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
.withSchedule(scheduleBuilder).build();
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
}
}
@Override
public void onApplicationEvent(ContextRefreshedEvent arg0) {
// TODO Auto-generated method stub
try {
getInit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
* @Description: 计划任务执行处 无状态
* @author ssk
* @date 2015年12月30日11:29:12
*/
public class QuartzJobFactory implements Job {
public final Logger log = Logger.getLogger(this.getClass());
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
TScheduleJob scheduleJob = (TScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
TaskUtils.invokMethod(scheduleJob);
}
}
/**
*
* @Description: 若一个方法一次执行不完下次轮转时则等待改方法执行完后才执行下一次操作
* @author ssk
* @date 2015年12月30日10:12:40
*/
@DisallowConcurrentExecution
public class QuartzJobFactoryDisallowConcurrentExecution implements Job {
public final Logger log = Logger.getLogger(this.getClass());
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
TScheduleJob scheduleJob = (TScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
TaskUtils.invokMethod(scheduleJob);
}
}
@Service
public class TaskUtils implements BeanFactoryAware{
public final static Logger log = Logger.getLogger(TaskUtils.class);
private static BeanFactory beanFactory;
/**
* 通过反射调用scheduleJob中定义的方法
*
* @param scheduleJob
*/
public static void invokMethod(TScheduleJob scheduleJob) {
Object object = null;
Class clazz = null;
//springId不为空先按springId查找bean
if (StringUtils.isNotBlank(scheduleJob.getFSpringId())) {
System.out.println("springid::::::::"+scheduleJob.getFSpringId());
System.out.println("beanFactory======="+beanFactory);
object = beanFactory.getBean(scheduleJob.getFSpringId());
} else if (StringUtils.isNotBlank(scheduleJob.getFBeanClass())) {
try {
clazz = Class.forName(scheduleJob.getFBeanClass());
object = clazz.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (object == null) {
log.error("任务名称 = [" + scheduleJob.getFJobName() + "]---------------未启动成功,请检查是否配置正确!!!");
return;
}
clazz = object.getClass();
Method method = null;
try {
method = clazz.getDeclaredMethod(scheduleJob.getFMethodName());
} catch (NoSuchMethodException e) {
log.error("任务名称 = [" + scheduleJob.getFJobName() + "]---------------未启动成功,方法名设置错误!!!");
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (method != null) {
try {
method.invoke(object);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void setBeanFactory(BeanFactory factory) throws BeansException {
// TODO Auto-generated method stub
beanFactory=factory;
}
4.service操作类
@Service
@Scope("singleton")
public class QuatzOperationService{
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
@Autowired
private TScheduleJobDAO TScheduleJobDAO;
/***
* 获取所有计划中的任务列表
*
* @return
* @throws SchedulerException
*/
@SuppressWarnings("unchecked")
public List<TScheduleJob> getAllJob() throws SchedulerException {
List<TScheduleJob> jobList = TScheduleJobDAO.findAll();
return jobList;
}
/**
* 所有正在运行的job
*
* @return
* @throws SchedulerException
*/
public List<TScheduleJob> getRunningJob() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
List<JobExecutionContext> executingJobs = scheduler
.getCurrentlyExecutingJobs();
List<TScheduleJob> jobList = new ArrayList<TScheduleJob>(
executingJobs.size());
for (JobExecutionContext executingJob : executingJobs) {
TScheduleJob job = new TScheduleJob();
JobDetail jobDetail = executingJob.getJobDetail();
JobKey jobKey = jobDetail.getKey();
Trigger trigger = executingJob.getTrigger();
job.setFJobName(jobKey.getName());
job.setFJobGroup(jobKey.getGroup());
job.setFDescription("触发器:" + trigger.getKey());
Trigger.TriggerState triggerState = scheduler
.getTriggerState(trigger.getKey());
job.setFJobStatus(triggerState.name());
if (trigger instanceof CronTrigger) {
CronTrigger cronTrigger = (CronTrigger) trigger;
String cronExpression = cronTrigger.getCronExpression();
job.setFCronExpression(cronExpression);
}
jobList.add(job);
}
return jobList;
}
/**
* 暂停一个job
*
* @param TTScheduleJob
* @throws SchedulerException
*/
public int upatePauseJob(TScheduleJob scheduleJob) throws SchedulerException {
int i = TScheduleJobDAO.updateById(scheduleJob);
if(i > 0){
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getFJobName(),
scheduleJob.getFJobGroup());
scheduler.pauseJob(jobKey);
}
return i;
}
/**
* 恢复一个job
*
* @param scheduleJob
* @throws SchedulerException
*/
public void resumeJob(TScheduleJob scheduleJob) throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getFJobName(),
scheduleJob.getFJobGroup());
scheduler.resumeJob(jobKey);
}
/**
* 删除一个job
*
* @param scheduleJob
*
* @throws SchedulerException
*/
public void deleteJob(TScheduleJob scheduleJob) throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getFJobName(),
scheduleJob.getFJobGroup());
scheduler.deleteJob(jobKey);
}
/**
* 立即执行job
*
* @param scheduleJob
* @throws SchedulerException
*/
public void runAJobNow(TScheduleJob scheduleJob) throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getFJobName(),
scheduleJob.getFJobGroup());
scheduler.triggerJob(jobKey);
}
/**
* 更新job时间表达式
*
* @param scheduleJob
*
* @throws SchedulerException
*/
public void updateJobCron(TScheduleJob scheduleJob)
throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(
scheduleJob.getFJobName(), scheduleJob.getFJobGroup());
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(scheduleJob.getFCronExpression());
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
.withSchedule(scheduleBuilder).build();
scheduler.rescheduleJob(triggerKey, trigger);
}
}