一个典型的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);