quartz 任务调度
quartz
设置参数, 获取参数
在job中使用spring注入的service对象
循环获取所有的job
删除job
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
添加maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
quartz 的 API 设计使用 domain-specific language (DSL), 写起来十分的流畅, 可读性高。 写之前先导入类方便IDE联想:
import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.impl.StdSchedulerFactory; import static org.quartz.JobBuilder.*; import static org.quartz.TriggerBuilder.*; import static org.quartz.SimpleScheduleBuilder.*;
使用:
@Test public void test4() throws SchedulerException { Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); JobDetail job1 = newJob(JobTest1.class) // 第一个参数name: job名称,job的唯一标志如果一个job未执行完继续使用同名的jobName会报错, // 第二个参数group:分组名称,用于逻辑处理 .withIdentity("test1", "test1Group").build(); Trigger trigger1 = newTrigger() .withIdentity("test1", "test1Group") .usingJobData("name", "scott") //设置参数,在JobTest1类中取用 .usingJobData("gender","male") .startNow() // 立即执行 .withSchedule(simpleSchedule() //通过simpleSchedule定时, 有很多种类,比如cron等等 .withIntervalInSeconds(60) //每60秒执行一次, 单位可设置为分,时,秒,毫秒 .withRepeatCount(2)) // 执行次数设置为2次,应为立即执行了一次, 所以实际执行此时是withRepeatCount+1次 .build();JobDataMap jobDataMap </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> JobDataMap(); jobDataMap.put(</span>"name", "scott"<span style="color: #000000;">); JobDetail job2 </span>= newJob(JobTest2.<span style="color: #0000ff;">class</span><span style="color: #000000;">) .withIdentity(</span>"test2", "test2Group"<span style="color: #000000;">) .usingJobData(jobDataMap) .build(); Trigger trigger2 </span>=<span style="color: #000000;"> newTrigger() .withIdentity(</span>"test2", "test2Group"<span style="color: #000000;">) .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(</span>20<span style="color: #000000;">) .repeatForever()) </span><span style="color: #008000;">//</span><span style="color: #008000;"> 奔流到海不复回</span>
.build();
scheduler.scheduleJob(job1, trigger1); scheduler.scheduleJob(job2, trigger2); scheduler.start(); }</span></pre>
JobTest1代码
package com.quartz;import org.quartz.*;
public class JobTest1 implements Job {
@Override </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> execute(JobExecutionContext context) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> JobExecutionException { JobDataMap jobDataMap </span>=<span style="color: #000000;"> context.getMergedJobDataMap(); String name </span>= jobDataMap.getString("name"); <span style="color: #008000;">//</span><span style="color: #008000;">获取参数</span> <span style="color: #0000ff;">int</span> gender = jobDataMap.getIntValue("gender"<span style="color: #000000;">); System.out.println(name</span>+<span style="color: #000000;">gender); }
}
JobTest2 的代码:
package com.quartz;import com.service.device.DeviceService;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class JobTest2 implements Job {
@Autowired
private DeviceService deviceService;@Override </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> execute(JobExecutionContext context) { SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(</span><span style="color: #0000ff;">this</span>); <span style="color: #008000;">//</span><span style="color: #008000;">在非spring托管的类中使用spring的对象</span> Integer result = deviceService.selectIdBydeviceCode("154653468"); <span style="color: #008000;">//</span><span style="color: #008000;">调用service层方法向数据库中查询数据</span>
System.out.println(result);
SimpleTrigger trigger = (SimpleTrigger) context.getTrigger(); int times = trigger.getTimesTriggered(); //获取当前执行次数 System.out.println("我是job2第"+times+"次运行"); } }JobDataMap jobDataMap </span>=<span style="color: #000000;"> context.getMergedJobDataMap(); String name </span>= jobDataMap.getString("name"<span style="color: #000000;">); System.out.println(name); </span><span style="color: #008000;">//</span><span style="color: #008000;">获取设置的参数</span>
循环所有的job, 删除指定job
@Test public void testQuartz1() { try { Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); for (String groupName : scheduler.getJobGroupNames()) { for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) { String jobName = jobKey.getName(); String jobGroup = jobKey.getGroup(); List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey); Date nextFireTime = triggers.get(0).getNextFireTime(); System.out.println(jobName + "第"+times+"次运行, 存在" + jobGroup + "组,距离下次到期时间" + nextFireTime); if(jobName.equalsIgnoreCase("test2")) //删除job scheduler.deleteJob(jobKey); } } } catch (Exception e) { e.printStackTrace(); } }