Quartz--01

Quartz

  调度器(scheduler):定时定频率的去执行任务
  任务(job):业务逻辑
  触发器(trigger):让任务生效的时间

JobDetail(包含任务实现类,任务信息)
  trigger(触发器)
  SimpleTrigger()
  CronTrigger(实现复杂的业务逻辑 常用)
  scheduler

重要组成

  Job
  JobDetail(通过反射机制实现job)
  JobBuilder
  JobStore
  Trigger(类)
  TriggerBuilder
  ThreadPool
  Scheduler
  Calendar
  监听器
  JobListener TriggerListener SchedulerListener

  Quartz使用写自己的job类实现job接口
  在execute方法中编写业务逻辑

  自定义类
  定义jobDetail trigger 对象

Demo

  myjob

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印当前时间
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time Is:" + sf.format(date));
        // 编写具体的业务逻辑
        System.out.println("Hello World!");
    }

}
package cn.miye.web;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        // 创建一个JobDetail实例,将该实例与HelloJobClass绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "group1")
                .usingJobData("message","hello myJob1")
                .usingJobData("FloatJobValue",3.14F)
                .build();
        // 创建一个Trigger实例,定义该job立即执行,并每隔两秒钟执行一次,直到程序停止
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("mytrigger", "group1")
                .usingJobData("message","hello myTrigger1")
                .usingJobData("DoubleTriggerValue",2.0D)
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(2).repeatForever()).build();
        // 创建Scheduler实例
        SchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        // 打印当前时间
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time Is:" + sf.format(date));
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

job实例在Quartz中额生命周期

  每次调度器执行job时,它在调用execute方法前会创建一个新的job实例
  当调用完成后,关联的job对象实例会被释放,释放的实例会被垃圾回收机制回收

jobDetai
  JobDetail为job实例提供了许多设置属性,以及jobDataMap成员变量属性,它用来存储特定job实例的状态信息,调度器需要借助jobDetail对象来添加job实例

  jobdetail用来绑定job,携带job的一些信息

  job的一些属性 name group jobClass jobDataMap
  组默认不写是DEFAULT

  取出jibDetail的属性
    jobDetail.getKey().getName();
    jobDetail.getKey().getGroup();

JobExectionContext
  当Scheduler调用一个job,就会将jobExecutionContext传递给job的execute()方法
  job能通过jobExecutionContext对象访问到Quartz运行时候的环境及job本身的明细数据

JobDataMap
  在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取
  JobDataMap可以用来装载任何可序列化的数据对象
  当job实例对象被执行时这些参数对象会传递给它
  JobDataMap实现JDK的Map接口,并且添加了一些非常方便的方法用来存取基本数据类型
  (键值对形式存取)

获取JobDataMap的两种方式
  从Map中直接获取

map中直接获取

package cn.miye.web;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

public class HelloJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印当前时间
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time Is:" + sf.format(date));
        // 编写具体的业务逻辑
        System.out.println("Hello World!");

        //获取jobDetail的名称和分组
        JobKey key = context.getJobDetail().getKey();
        System.out.println(key.getName()+":"+key.getGroup());

        //获取trigger的名称和分组
        TriggerKey trkey = context.getTrigger().getKey();
        System.out.println(trkey.getName()+":"+trkey.getGroup());

        //获取自定义传入的自定义参数的值

        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        JobDataMap tdataMap = context.getTrigger().getJobDataMap();
        String jobMsg = dataMap.getString("message");
        float jobFloatValue = dataMap.getFloat("FloatJobValue");
        String triggerMsg = tdataMap.getString("message");
        Double triggerDoubleValue = tdataMap.getDouble("DoubleTriggerValue");
        System.out.println(jobMsg+"--"+jobFloatValue);
        System.out.println(triggerMsg+"--"+triggerDoubleValue);

        //获取jobDetail和trigger合并的key
        //如果jobDetail和trigger的key值相同,那么trigger会覆盖jobDetail
        JobDataMap mergedJobDataMap = context.getMergedJobDataMap();
        String msg = mergedJobDataMap.getString("message");
        Float mergetJobFloatValue = mergedJobDataMap.getFloat("FloatJobValue");
        Double mergeTriggerDoubleValue = mergedJobDataMap.getDouble("DoubleTriggerValue");
        System.out.println(msg);
        System.out.println(mergetJobFloatValue);
        System.out.println(mergeTriggerDoubleValue);
    }

}

  job实现类中添加setter方法对应JobDataMap的键值
  (Quartz框架默认的JobFactory实现类在初始化job实例对象时会自动的调用这些setter方法)

  

通过setter方法获取(定义的成员变量名称应与传入的key的名称相同)

package cn.miye.web;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

public class HelloJob implements Job {
    private String message;
    private Float FloatJobValue;
    private Double DoubleTriggerValue;

    public String getMessage() {
        return message;
    }

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

    public Float getFloatJobValue() {
        return FloatJobValue;
    }

    public void setFloatJobValue(Float floatJobValue) {
        FloatJobValue = floatJobValue;
    }

    public Double getDoubleTriggerValue() {
        return DoubleTriggerValue;
    }

    public void setDoubleTriggerValue(Double doubleTriggerValue) {
        DoubleTriggerValue = doubleTriggerValue;
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印当前时间
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time Is:" + sf.format(date));
        System.out.println(message);
        System.out.println(FloatJobValue);
        System.out.println(DoubleTriggerValue);
    }

}

传递自定义参数
  .usingJobData("key1","value1").usingJobData("key2",value2)

trigger
Quartz中的触发器,用来告诉调度程序什么时候触发,即Trigger对象是用来触发Job的

trigger通过builder模式创建

时间: 2024-10-11 22:10:37

Quartz--01的相关文章

我喜欢减肥我们来减肥吧

http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313278016/2015.01.28.html http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313282016/2015.01.28.html http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313289016/2015.01.28.html http://www.ebay.com/cln/usli

百度回家看沙发沙发是减肥了卡斯加积分卡拉是减肥

http://www.ebay.com/cln/hpryu-caw8ke/cars/158056866019/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445650015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445674015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/1584456790

巢哑偕倥乇椭煞谙暗逞帕俸

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

我国第三代移动通信研究开发进展-尤肖虎200106

众所周知,数据科学是这几年才火起来的概念,而应运而生的数据科学家(data scientist)明显缺乏清晰的录取标准和工作内容.此次课程以<星际争霸II>回放文件分析为例,集中在IBM Cloud相关数据分析服务的应用.面对星际游戏爱好者希望提升技能的要求,我们使用IBM Data Science Experience中的jJupyter Notebooks来实现数据的可视化以及对数据进行深度分析,并最终存储到IBM Cloudant中.这是个介绍+动手实践的教程,参会者不仅将和讲师一起在线

pl/sql学习1——标量变量psahnh6S

为类型.不能用于表列的数据类型.范围为的子类型.自然数.为的子类型.具有约束为单精度浮点数.为变量赋值时.后面要加为双精度浮点数.为变量赋值时.后面要加.为数字总位数.为小数位数是的子类型.最大精度位是的子类型.最大精度位单精度浮点型是的子类型.最大精度位双精度浮点型定义精度为位的实数..定义为位的整数.变长字符串.最长测试变量数据!.定长字符串.最长测试变长二进制字符串物理存储的为类型...固定长度.个字节使用定义数据类型那个最小值:最大值:最小值:最大值:最小值:最大值:最小值:最大值:最小

Quartz.net 2.x 学习笔记01

Quartz.net 2.0 2012年4月9日发布了Released版本,到目前(2014-12-08)为止是2.3版 Quartz.net 项目地址:http://www.quartz-scheduler.net/ 官方2.x 教程:http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/index.html Quartz.net 2.x在.net中的使用 Quartz.net 的介绍和下载网上很多.Quartz.n

Quartz.NET教程:(01) 使用Quartz

使用调度器 (scheduler) 之前要先用 ISchedulerFactory 的一个实现来实例化调度器(scheduler).一旦调度器实例化完成,则它可以被启动.置于备用模式或者关闭.需要注意的是一旦调度器被关闭,只有重新实例化后才能重新启动它.调度器启动前或者触发器处于暂停状态时,触发器都不会被触发(即任务不会执行). 下列代码片段演示了实例化并启动一个调度器,并且安排了一个任务以便执行: 使用 Quartz.NET // construct a scheduler factory I

quartz定时任务_演示版01

预置: quartz共4个设计模式:Builder模式,Factory模式,组件模式,链式模式 体系结果:核心3个类JobDetail , trigger , scheduler 重要组成部分:Job接口.JobBuilder.JobDetail.JobStore                    TriggerBuilder.Trigger Scheduler 接听器:JobListener.TriggerListener.SchedulerListener ThreadPool (线程池

Quartz+spring+maven集成实例(解决Job实现类注入bean为空的问题)

环境: jdk1.7.eclipse.maven.quartz2.2.1 包的架构: 流程: 1.创建项目并在pom中加入相应的jar包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

Quartz中时间表达式的设置-----corn表达式 (转)(http://www.cnblogs.com/GarfieldTom/p/3746290.html)

Quartz中时间表达式的设置-----corn表达式 (注:这是让我看比较明白的一个博文,但是抱歉,没有找到原作者,如有侵犯,请告知) 时间格式: <!-- s m h d m w(?) y(?) -->,   分别对应: 秒>分>小时>日>月>周>年, 举例: 1.每天什么时候执行: <value>0 59 23 * * ?</value>: 如下为每天23:59:00开始执行 <value>0 1,2,3 11,12