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实例,这样就可以规避并发访问的问题。
  • 相关阅读:
    Kubernetes 集成研发笔记
    Rust 1.44.0 发布
    Rust 1.43.0 发布
    PAT 甲级 1108 Finding Average (20分)
    PAT 甲级 1107 Social Clusters (30分)(并查集)
    PAT 甲级 1106 Lowest Price in Supply Chain (25分) (bfs)
    PAT 甲级 1105 Spiral Matrix (25分)(螺旋矩阵,简单模拟)
    PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)
    java 多线程 26 : 线程池
    OpenCV_Python —— (4)形态学操作
  • 原文地址:https://www.cnblogs.com/java-gaolei/p/8027883.html
Copyright © 2011-2022 走看看