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)

Quartz--01的更多相关文章

  1. Quartz.net 2.x 学习笔记01

    Quartz.net 2.0 2012年4月9日发布了Released版本,到目前(2014-12-08)为止是2.3版 Quartz.net 项目地址:http://www.quartz-sched ...

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

    使用调度器 (scheduler) 之前要先用 ISchedulerFactory 的一个实现来实例化调度器(scheduler).一旦调度器实例化完成,则它可以被启动.置于备用模式或者关闭.需要注意 ...

  3. Quartz.Net 学习之路01 安装Quartz.Net

    Quartz.Net 系列文章的第一篇,至于Quartz.Net 是做什么的我就不介绍了,相信要用到它的都知道它是用来干嘛的: Quartz.Net安装方法: 1.打开项目,在VS“工具”菜单选中“库 ...

  4. Quartz.NET常用方法 01

    Quartz.NET作为一款定时框架,它的最小可运行程序如下: var scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler ...

  5. Spring Quartz实现任务调度

    任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...

  6. Quartz.Net简单使用

    Quartz.Net为开源的作业调度框架,使用方便,实现IJob接口,及相关配置,即可实现调度. 项目包安装: install-package Quartz install-package log4n ...

  7. 初识Quartz(入门案例)+常用的Cron表达式

    1.Quartz架构图 1.实体层 package cn.happy.entity; //1. public class Plan { //时间 private String date; //任务 p ...

  8. Quartz 入门详解

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

  9. 任务调度开源框架Quartz动态添加、修改和删除定时任务

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触发器监听.你可以配置作业和触发器监听为全局监听或者是特定于 ...

  10. 【JAVA】Quartz中时间表达式的设置

    Quartz中时间表达式的设置-----corn表达式 时间格式: <!-- s m h d m w(?) y(?) -->,   分别对应: 秒>分>小时>日>月 ...

随机推荐

  1. linux 文件 chgrp、chown、chmod

    linux 默认情况下有会提供6个terminal 来让用户登录,使用[Ctrl]+[Alt] +[F1]~[F6] 组合 linux 文件 任何一个文件都具有"user,Group及Oth ...

  2. 数据流和ByteArray

    问题:如何把一个long类型的数写进一个文件里 所以现在有DataInputStream和DataOutputStream 这两个是节点流 例子代码: import java.io.*; public ...

  3. Webform 三级联动例子

    首先分别做三个下拉列表 <body> <form id="form1" runat="server"> <asp:DropDown ...

  4. Windows下的一个Nginx 批处理命令行控制台

    其实作用很简单,就是为了少输入几个字母,完成对Nginx的控制而已,同时也算是练习了一把bat批处理吧. @echo off&color e&Title Nginx 命令行控制台 cl ...

  5. React 实践心得:react-redux 之 connect 方法详解

    Redux 是「React 全家桶」中极为重要的一员,它试图为 React 应用提供「可预测化的状态管理」机制. Redux 本身足够简单,除了 React,它还能够支持其他界面框架.所以如果要将 R ...

  6. springmvc 获取数组

    spingmvc 获取数据有这几种方式:1.通过HttpRequestServlet的方法获取数据.2.form表单传递对象字段,springmvc自动获取.3.ajax 请求通过注解的方式直接获取数 ...

  7. 程序员的职业方向: 是-->技术?还是-->管理?

    岁之后还能不能再做程序员....... 绝大多数程序员最终的职业目标可能都是CTO,但能做到CEO的人估计会比较少,也有一少部分人自己去创业去当老板,也有部分人转行了,当老板的人毕竟是少数,转行的人都 ...

  8. Java.io.ObjectOutputStream.writeObject()方法实例

    java.io.ObjectOutputStream.writeObject(Object obj) 方法将指定对象写入ObjectOutputStream.该对象的类,类的签名,以及类及其所有超类型 ...

  9. Java之抽象和封装

    ① 如何从现实世界中抽象出类?    根据软件开发需求: 发现类-->发现类的属性-->发现类的方法    ②   构造方法的作用和特点是什么?    作用:在创建对象时执行一些初始化操作 ...

  10. python学习日记-01

    一. 熟悉 在正式介绍python之前,了解下面两个基本操作对后面的学习是有好处的: (1)基本的输入输出 可以在Python中使用+.-.*./直接进行四则运算. >>> 1+3* ...