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);

    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>
SimpleTrigger trigger = (SimpleTrigger) context.getTrigger(); int times = trigger.getTimesTriggered(); //获取当前执行次数 System.out.println("我是job2第"+times+"次运行"); } }

 

循环所有的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();
        }
    }

 

posted @ 2018-11-18 23:49  _戈多  阅读(843)  评论(0)    收藏  举报