java定时定时任务quartz

发布时间 2023-07-18 16:28:15作者: 与f

Quartz是一个Java版开源定时调度器,功能强悍,使用方便。

一、核心概念

1.Job

表示一个工作,要执行的具体内容,此接口只有一个方法

void execute(JobExecutionContext context)

2.JobDetail

JobDetail表示一个具体的可以执行的调度程序,Job是这个可以执行程序所要执行的内容内容,JobDetail包含这个任务调度的方案和策略。

3.Trigger代表一个调度参数的配置,什么时候去调。

4.Schedule代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger,当JobDetail和Trigger组合就可以被容器调度。

 

二:例子

   public static void main(String[] args) {
         try {
             //创建scheduler
             Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
 
             //定义一个Trigger
             Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") //定义name/group
                     .startNow()//一旦加入scheduler,立即生效
                     .withSchedule(simpleSchedule() //使用SimpleTrigger
                             .withIntervalInSeconds(1) //每隔一秒执行一次
                             .repeatForever()) //一直执行,奔腾到老不停歇
                     .build();
 
             //定义一个JobDetail
             // 创建一个JobDetail实例,此版本JobDetail已经作为接口(interface)存在,通过JobBuilder创建
             // 并指定Job在Scheduler中所属组及名称
           //  JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job1","group1").build();
             JobDetail job = JobBuilder.newJob(MyJob.class) //定义Job类为HelloQuartz类,这是真正的执行逻辑所在
                     .withIdentity("job1", "group1") //定义name/group
                     .usingJobData("name", "quartz") //定义属性
                     .build();
 
             //加入这个调度
             scheduler.scheduleJob(job, trigger);
 
             //启动之
             scheduler.start();
 
             //运行一段时间后关闭
             Thread.sleep(10000);
             scheduler.shutdown(true);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }

 

package quartz;

import org.quartz.*;

import java.util.Date;

/**
 * @author
 * @create 2017-12-12 10:49
 **/
public class MyJob implements Job{

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // JobExecutionContext类提供了调度上线问的各种信息,为JobDetail和Trigger提供必要的信息
        // JobKey是由name和group组成,并且name必须在group内是唯一的。如果只指定一组则将使用默认的组名。
        JobDetail detail = jobExecutionContext.getJobDetail();
        String name = detail.getJobDataMap().getString("name");
        System.out.println("hello " + name + "--- " + new Date());

        /**
         * JobDetail detail = context.getJobDetail();
         String name = detail.getJobDataMap().getString("name");
         System.out.println("say hello to " + name + " at " + new Date());
         */
    }
}

 

 

上面例子很好的展示的Quartz的三个要素

  • Scheduler:调度器。所有的调度都是由它控制。
  • Trigger: 定义触发的条件。例子中,它的类型是SimpleTrigger,每隔1秒中执行一次(什么是SimpleTrigger下面会有详述)。
  • JobDetail & Job: JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中,例子中是HelloQuartz。 为什么设计成JobDetail + Job,不直接使用Job?这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。

 

转: https://www.cnblogs.com/java-gaolei/p/8027883.html