quartz 定时任务的总结

Posted laosunlaiye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了quartz 定时任务的总结相关的知识,希望对你有一定的参考价值。

简单了解quartz 概念,知道它干什么之后,

我们开始代码之前先了解这几个对象:

1、Job

表示一个工作,要执行的具体内容。此接口中只有一个方法
void execute(JobExecutionContext context)
 
2、JobDetail
JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。
 
3、Trigger代表一个调度参数的配置,什么时候去调。
 
4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。
 
 
 

 

1.首先导入quartz的jar

<!-- quartz 的jar -->
    <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>

技术分享图片

 2.创建一个Myjob  implements Job接口

public class MyJob implements Job {
    //获取JobDataMap的两种方式:
    //1.可以通过定义属性, 来获取JobDataMap 的值,不过定义的属性名必须和JobDataMap的key值一样,创建setter getter 方法,就可以直接使用! 如果JobDetail里面的JobDataMap的key值与trigger的key值一样,只能拿到trigger的jobdatamap 的value
    //2. 通过JobExecutionContext 对象 来获取, context.getJobDetail().getJobDataMap();    context.getTrigger().getJobDataMap(); 然后通过get("key值") 就可以获得
    /*private String message;

    public String getMessage() {
        return message;
    }*/

  /*  public void setMessage(String message) {
        this.message = message;
    }*/

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH : mm: ss");
        format.format(date);
        JobKey jobKey = context.getJobDetail().getKey();
        String name = jobKey.getName();
        String group = jobKey.getGroup();
        System.out.println("此任务的name: " + name + "组名称 :"+ group + "在"+format.format(date) + "开始运行!");
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();


        System.out.println("获取JobDetailMap 的message 的值:" +  jobDataMap.get("message") );
    }
}

 

   3编写测试类

MyFristTest类:

  public static void main (String[] args){
        //下面的.usingJobData("message","job1使用的jobDetailmap") 就是给JobDataMap 里面添加key,value;
        //jobDetail trigger 都是bulider模式创建,通过.withIdentity("job01","group1") 方式设置 name, group,quartz的机制是一个job可以有多个trigger,但是一个trigger只能有一个job。
        
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job01","group1").usingJobData("message","job1使用的jobDetailmap").build();

        //设定时间戳 启动3秒后开始执行,时间间隔是每两秒执行一次
      long currentTimeMillis = System.currentTimeMillis();
        SimpleDateFormat format = new SimpleDateFormat("yyyy- MM -dd HH:mm:ss");
        System.out.println("当前时间是:"+    format.format(new Date()));
        currentTimeMillis +=  3000;

        Date date = new Date(currentTimeMillis);
        SimpleDateFormat format1 = new SimpleDateFormat("yyyy- MM -dd HH:mm:ss");

        System.out.println("开始时间是:"+    format1.format(date));
       /* try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/

        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger01","triggerGroup01").withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)).startAt(date).build();
        //获取Scheduler调度器,
        SchedulerFactory sf = new StdSchedulerFactory();
        try {
            Scheduler scheduler =sf.getScheduler();
            //开始调度
            scheduler.start();
            //调度jobDetail和trigger
            scheduler.scheduleJob(jobDetail,trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

4.运行结果:

技术分享图片

 

以上是关于quartz 定时任务的总结的主要内容,如果未能解决你的问题,请参考以下文章

atititt.java定时任务框架选型Spring Quartz 注解总结

原!总结 quartz集群 定时任务 测试运行ok

Quartz总结:定时任务中使用业务类(XXService)

Quartz定时任务

Quartz.NET总结Quartz 远程调度

对quartz定时任务的初步认识