zoukankan      html  css  js  c++  java
  • quzrtz的使用

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

    一、核心概念

    1.Job

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

    void execute(JobExecutionContext context)

    2.JobDetail

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

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

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

    二:例子:

     1    public static void main(String[] args) {
     2         try {
     3             //创建scheduler
     4             Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
     5 
     6             //定义一个Trigger
     7             Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") //定义name/group
     8                     .startNow()//一旦加入scheduler,立即生效
     9                     .withSchedule(simpleSchedule() //使用SimpleTrigger
    10                             .withIntervalInSeconds(1) //每隔一秒执行一次
    11                             .repeatForever()) //一直执行,奔腾到老不停歇
    12                     .build();
    13 
    14             //定义一个JobDetail
    15             // 创建一个JobDetail实例,此版本JobDetail已经作为接口(interface)存在,通过JobBuilder创建
    16             // 并指定Job在Scheduler中所属组及名称
    17           //  JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job1","group1").build();
    18             JobDetail job = JobBuilder.newJob(MyJob.class) //定义Job类为HelloQuartz类,这是真正的执行逻辑所在
    19                     .withIdentity("job1", "group1") //定义name/group
    20                     .usingJobData("name", "quartz") //定义属性
    21                     .build();
    22 
    23             //加入这个调度
    24             scheduler.scheduleJob(job, trigger);
    25 
    26             //启动之
    27             scheduler.start();
    28 
    29             //运行一段时间后关闭
    30             Thread.sleep(10000);
    31             scheduler.shutdown(true);
    32         } catch (Exception e) {
    33             e.printStackTrace();
    34         }
    35     }
    简单例子
    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());
             */
        }
    }
    View Code

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

    • Scheduler:调度器。所有的调度都是由它控制。
    • Trigger: 定义触发的条件。例子中,它的类型是SimpleTrigger,每隔1秒中执行一次(什么是SimpleTrigger下面会有详述)。
    • JobDetail & Job: JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中,例子中是HelloQuartz。 为什么设计成JobDetail + Job,不直接使用Job?这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。
  • 相关阅读:
    P7276-送给好友的礼物【dp】
    P4831-Scarlet loves WenHuaKe【组合数学】
    CF461D-Appleman and Complicated Task【并查集】
    P6499-[COCI2016-2017#2]Burza【状压dp】
    CF757F-Team Rocket Rises Again【最短路,DAG支配树】
    Loj#6053-简单的函数【Min25筛】
    P5325-[模板]Min_25筛
    2019.10.6 机房训练赛
    [CSP校内集训]v(记忆化搜索+map优化状压)
    [CSP校内集训]ac(树上启发式合并)
  • 原文地址:https://www.cnblogs.com/java-gaolei/p/8027883.html
Copyright © 2011-2022 走看看