java定时定时任务quartz
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
https://www.bilibili.com/video/BV144411V7H9?p=2
https://blog.csdn.net/qq798867485/article/details/128072743