Quartz调度实践

来源:互联网 发布:纯js省市区三级联动 编辑:程序博客网 时间:2024/04/29 05:00

一个典型的quartz调度做法(不结合spring)

首先声明一个类继承Job接口,将来quartz会调度这个类的execute
public class UpdateConfigurationTask implements Job{public void execute(JobExecutionContext context) throws JobExecutionException {try{if(!ClientManager.hasInit()){ClientManager.init();}ClientManager.updateConfig();}catch(Exception ex){LogWriter.writeErrorLog("从统一配置平台更新配置失败"+ex.getMessage());}}}

定义JobDetail,用以设置Job的各种属性
JobDetail jobDetail = new JobDetail("updateConfigurationTask","jGroup1", UpdateConfigurationTask.class);

 

定义一个Trigger

SimpleTrigger simpleTrigger = new SimpleTrigger("ConfigurationCenterTrigger","group1");


设置trigger的属性,主要是运行周期,时间,间隔等

simpleTrigger.setStartTime(new Date());simpleTrigger.setRepeatInterval(150000);simpleTrigger.setRepeatCount(org.quartz.SimpleTrigger.REPEAT_INDEFINITELY);

从SchedulerFactory获取一个Scheduler对象
SchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();

 使用定义的Trigger调度定义的JobDetail
scheduler.scheduleJob(jobDetail, simpleTrigger);scheduler.start();

那么Spring是如何做的呢

首先依然是一个作业类,不过不需要继承Job接口了
接下是定义JobDetail,MethodInvokingJobDetailFactoryBean起到工厂类的作用,生成JobDetail对象并制定需要调用的类及类的方法
<bean id="Order1JobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">     <property name="targetObject" ref="secondHandReturnOrder1JobServiceImpl" /><!-- 调用的类 -->      <property name="targetMethod" value="Run" /><!-- 调用类中的方法 -->      <property name="concurrent" value="false" /></bean>

定义CronRigger,CronTriggerBean其实是继承了CronTrigger

<bean id="Order1DoTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="secondHandReturnOrder1JobTask" /> <!-- cron表达式 --> <property name="cronExpression" value="0 30 2 * * ?" /></bean>

从SchedulerFactory获取Scheduler对象并调度定义的Trigger

<bean id="startQuartz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">     <property name="triggers">         <list>               <ref bean="secondHandReturnOrder1DoTime"/>          </list>      </property>  </bean>

做个api来监控和调度Quartz吧

我称之为Quartz API,它是一个servlet,起到API的作用,接受外部请求,展示并控制当前quartz调度的任务

首先获取Spring注入生成的Schedule

applicationContext=WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext()); scheduler=(Scheduler) applicationContext.getBean("startQuartz");

获取当前调度的Quartz信息
String [] triggerGNs = scheduler.getTriggerGroupNames();for (int i = 0; i < triggerGNs.length; i++) {String [] triggerNames = scheduler.getTriggerNames(triggerGNs[i]);for (int j = 0; j < triggerNames.length; j++) {Trigger trigger = scheduler.getTrigger(triggerNames[i], triggerGNs[i]);HashMap<String, String> map = new HashMap<String, String>();if(trigger instanceof CronTrigger){map.put("cronExpression", ((CronTrigger)trigger).getCronExpression());}map.put("jobname", trigger.getJobName());map.put("jobgroup", trigger.getJobGroup());map.put("last_time", df.format(EConvert.toDate(trigger.getPreviousFireTime())));map.put("next_time", df.format(EConvert.toDate(trigger.getNextFireTime())));int status = scheduler.getTriggerState(trigger.getName(), trigger.getGroup());map.put("status",getTriggerStatusName(status));list.add(map);}}

暂停/恢复Job
pause
scheduler.pauseJob(jobname, jobgroup);

resume
scheduler.resumeJob(jobname, jobgroup);

执行一次作业

scheduler.triggerJob(jobname, jobgroup);