1、什么是Quartz

Quartz是一个任务调度框架,借助Cron表达式,Quartz可以支持各种复杂的任务调度。JDK中也提供了简单的任务调度,java.util.Timer。

Quartz的三大要素:作业bean(JobDetailBean)、触发器(Trigger)、调度器(Scheduler)

2、Quartz运行的基本属性

quartz有一个默认的配置文件quartz.properties,放置于quartz-2.2.2.jar中的org\quartz下。如果需要改变默认的配置,可以自己创建一个,将其放置于系统的类加载路径下,ClassLoader会自动加载并启动其中的属性。

查看其中内容:

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#

#配置主调度器属性
org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

#配置线程池
#quartz线程池的实现类
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
#线程池的线程数量,表明系统最多指定多少条线程来执行指定任务,意味着系统可能有多个任务并发执行
org.quartz.threadPool.threadCount: 10
#线程池里线程的优先级
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
#配置作业环境
org.quartz.jobStore.misfireThreshold: 60000
#指定作业存储方式
org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

 quartz提供了两种作业存储方式:

1》RaMJobStore:利用内存来持久化调度程序信息。这种作业存储类型易于配置和运行,但程序退出后配置信息也就丢失了。

2》JDBC作业存储:JDBC驱动程序+后台数据库保存调度程序信息。

3、quartz中的Job

Job是一个执行指定任务的java类,当quartz调用某个java任务执行时,实际上就是执行该任务对象的execute()方法。quartz中的作业需要实现org.quartz.Job接口,该接口中包含一个execute()方法,该方法的方法体是被调度的作业体。

一旦实现了Job接口和execute()方法,当quartz调度该作业运行时,该execute()方法就会自动运行起来。

使用JobDetail包装一个作业,在包装时,包括给作业指定作业名,指定作业所在的组。

4、quartz中的触发器

quartz允许作业与作业调度分离,使用触发器将作业与作业调度分离。触发器指定任务的被调度时机,其框架提供了一系列触发器类型,常用的有:

1》SimpleTrigger:简单触发器。

2》CronTrigger:用于执行更复杂的调度,基于Unix Cron。该调度器基于Calendar-like。

Cron表达式是一个字符串,字符串以5个或6个空格隔开,分成6个或7个域,每个域代表一个时间域。Cron表达式有两种语法格式。

5、quartz中的调度器

调度器用于将任务和触发器关联起来,一个任务可以关联多个触发器,一个触发器也可以用于控制多个任务。当一个任务关联多个触发器时,每个触发器被激活时,这个任务都会被调度一次;当一个触发器控制多个任务时,此触发器被触发时,所有关联的任务都将被调度。

quartz的调度器由Scheduler接口实现,其中声明的方法有:

1》void addJob(JobDetail jobDetail,boolean replace):将给定的JobDetail实例添加到调度器里。

2》Date scheduleJob(JobDetail jobDetail,Trigger trigger):将指定的JobDetail实例与给定的triger关联起来,即使用该trigger来控制该任务。

3》Date scheduleJob(Trigger trigger):添加触发器trigger来调度作业。

6、spring中整合quartz

spring的任务的任务调度抽象层简化了任务调度,在quartz基础上提供了更好的调度抽象。创建quartz作业bean(即:JobDetailBean)有以下两个方法:

1》使用JobDetailBean包装QuartzJobBean子类的实例。即作业bean必须继承于QuartzJobBean类,它是一个抽象类,包含的方法有:

1>executeInternal(JobExecutionContext ctx):被调度任务的执行体

2》使用MethodInvokingJobDetailFactoryBean工厂bean包装普通的Java bean。

使用MethodInvokingJobDetailFactoryBean包装,则无需继承任何父类,直接使用配置即可,配置MethodInvokingJobDetailFactoryBean,需要指定以下两个属性:

1>targetObject:指定包含任务执行体的bean实例。

2>targetMethod:指定将指定bean实例的该方法包装成任务执行体。

3》应用步骤举例:

           --步骤1:创建JobDetailBean

1>使用JobDetailBean(或者JobDetailFactoryBean)包装作业bean的配置举例

<!--定义JobDetailBean bean-->
<!--以指定QuartzJobBean子类实例的executeInternal()方法作为任务实体-->
<bean name="quartzDetail" class="org.springframework.scheduling.quartz.JobDetailBean" p: jobClass="QuartzJobBean子类"/>

2>使用MethodInvokingJobDetailFactoryBean包装

<!--定义目标bean-->
<bean id="mailQuartz" class="com.lfy.bean.MailQuartz"/>
<!--定义MethodInvokingJobDetailFactoryBean bean-->
<bean id="quartzDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
p:targetObject-ref="mailQuartz"
p:targetMethod="send"/>

完成以上两种不同的JobDetailBean作业bean注册后,只需以下两个步骤即可完成任务的调度:

1>使用SimpleTriggerBean或CronTriggerBean定义触发器Bean。    --步骤2:创建触发器

2>使用SchdulerFactoryBean调度作业。                                        --步骤3:创建调度器

 7、举个简单的例子

编写JobDetailBean:GreetJob.java

package com.lfy.jobdetailbean;

import java.text.SimpleDateFormat;
import java.util.Date; import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean; import com.lfy.bean.Tomcat; public class GreetJob extends QuartzJobBean{ //作业是否正在执行的flag
private boolean isRunning=false;
private String name;
private Tomcat tomcat; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Tomcat getTomcat() {
return tomcat;
} public void setTomcat(Tomcat tomcat) {
this.tomcat = tomcat;
} public void sayHello() {
System.out.println(name+",你好呀。");
} private String getTimeStamp(long timestamp) { Date date=new Date(timestamp);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timeStamp=dateFormat.format(date);
return timeStamp;
} @Override
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException { long currentTime=System.currentTimeMillis();
String timeStamp=getTimeStamp(currentTime);
System.out.println(timeStamp+":executeInternal()有调度线程进来...");
if(!isRunning) {
System.out.println("开始调度作业...");
isRunning=true;
sayHello();
tomcat.selfIntroduction(name);
isRunning=false;
}
currentTime=System.currentTimeMillis();
timeStamp=getTimeStamp(currentTime);
System.out.println(timeStamp+":executeInternal()线程从函数返回...\n");
}
}

Tomcat.java

package com.lfy.bean;

public class Tomcat {

    public void selfIntroduction(String name) {

        System.out.println("hello,我是"+name+"家的汤姆猫。");
}
}

在beans.xml中注册触发器、调度器

<?xml version="1.0" encoding="UTF-8"?>
<!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <bean id="tomcat" class="com.lfy.bean.Tomcat"/>

<!-- cronExpression表达式指定Cron表达式:从启动开始,每5秒运行一次 -->
<bean id="cronTriggerSayHello"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
p:cronExpression="/5 * * * * ? *">
<property name="jobDetail">
<!-- 使用嵌套bean的方式来定义任务bean,jobClass指定任务bean的实现类 -->
<bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean"
p:jobClass="com.lfy.jobdetailbean.GreetJob"
p:durability="true">
<!-- 为任务bean注入属性 -->
<property name="jobDataAsMap">
<map>
<entry key="name" value="lfy"/>
<entry key="tomcat" value-ref="tomcat"/>
</map>
</property>
</bean>
</property>
</bean>

<!-- 执行任务调度 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerSayHello"/>
</list>
</property>
</bean>
</beans>

或者使用另外一种包装job的形式:

<bean id="generalJob" class="com.lfy.jobdetailbean.GeneralJob"/>
...
<bean id="cronTriggerSayGoodBye"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
p:cronExpression="/6 * * * * ? *">
<property name="jobDetail">
<bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
p:targetObject-ref="generalJob"
p:targetMethod="greet">
</bean>
</property>
</bean>
...
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
...
<ref bean="cronTriggerSayGoodBye"/>
</list>
</property>
</bean>

QuartzTest.java

package com.lfy.main;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class QuartzTest { public static void main(String[] args) {
//创建spring容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
}
}

运行结果:

总结:

1》定义一个JobDetailBean,继承自org.springframework.scheduling.quartz.QuartzJobBean,并实现唯一抽象方法executeInternal(),该方法在job被触发的时候自动调用。

2》将触发器和JobDetailBean关联起来。JobDetailBean作为触发器的属性。

3》在org.springframework.scheduling.quartz.SchedulerFactoryBean调度工厂中注册触发器。

Quartz-第一篇 认识Quartz的更多相关文章

  1. Quartz -第一篇-入门

    学习地址:https://www.imooc.com/learn/846 官网:www.quartz-scheduler.org 特点:分布式+集群 设计模式: 工厂模式 builder模式 组件模式 ...

  2. Quartz基础调度框架-第一篇控制台

    Quartz基础调度框架 Quartz核心的概念:scheduler任务调度.Job任务.Trigger触发器.JobDetail任务细节 结构 Conf 在这个基本结构里 是用来存放配置 publi ...

  3. [转][JAVA]定时任务之-Quartz使用篇

    [BAT][JAVA]定时任务之-Quartz使用篇 定时任务之-Quartz使用篇 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与 ...

  4. [JAVA]定时任务之-Quartz使用篇

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

  5. 定时调度篇之Quartz.Net详解(被替换)

    一. 背景 我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "."每天的0点需要统计前一天的考勤记录"."每个月 ...

  6. Quartz-第四篇 常规quartz的使用

    1.目录结构 2.主要文件 1>引入的jar包,quartz-2.2.2解压后lib下所有的jar包 2>quartz.properties org.quartz.threadPool.t ...

  7. 从.Net到Java学习第一篇——开篇

    以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...

  8. Quartz学习——Spring和Quartz集成详解(三)

    Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度.下面就对Spring集成Quartz进行简单的介绍和示例讲解!和上一节 Quar ...

  9. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

随机推荐

  1. JavaScript 模块化简析

    关于模块化,最直接的表现就是我们写的 require 和 import 关键字,如果查阅相关资料,就一定会遇到 CommonJS .CMD AMD 这些名词,以及 RequireJS.SeaJS 等陌 ...

  2. ssm框架搭建整合测试

    下载各种jar包 mybatis下载 https://github.com/mybatis/mybatis-3/releases mysql驱动下载 http://mvnrepository.com/ ...

  3. Vue实现active点击切换

    Vue实现active点击切换 循环的情况: 1.点击时传入index索引(获取当前点击的是哪个) @click=“active(index)” 2.将索引值传入class(索引等于几就第几个添加ac ...

  4. Linux性能优化从入门到实战:15 文件系统篇:磁盘 I/O

    磁盘   磁盘是可以持久化存储的设备,按照存储介质来分类:   (1)机械磁盘(硬盘驱动器,Hard Disk Driver,HDD),主要由盘片和读写磁头组成,数据就存储在盘片的环状磁道中.在读写数 ...

  5. gbase整合mybatis出现: Cause: java.sql.SQLException: Can't convert to: binary stream

    参考地址:http://mybatis-user.963551.n3.nabble.com/Map-SQL-Type-LVARCHAR-x-to-JDBC-Type-VARCHAR-globally- ...

  6. WiFi密码新攻击破解方法,黑客攻破只需10秒

    近日,中国知名黑客安全组织东方联盟研究人员透露了一种新的WiFi黑客技术,使黑客更容易破解大多数现代路由器的WiFi密码,并且攻破只需要10秒,速度非常快. 方法是利用由流行的密码破解工具Hashca ...

  7. RMQ HelloWorld

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11791681.html Project Directory Maven Dependency < ...

  8. 阿里云弹性裸金属服务器-神龙架构(X-Dragon)揭秘

    在5月16日的飞天技术会新品直播中,特别邀请了业界知名大咖狒哥以及阿里云虚拟化资深专家旭卿作为现场直播的嘉宾.本次直播主要从产品背景到“X-Dragon架构”,从硬件设备到软件应用来深度的剖析“X-D ...

  9. iOS10以上App请求用户授权系统设置权限

    <key>NSAppleMusicUsageDescription</key> <string>使用媒体资源</string> <key>N ...

  10. 新手立体四子棋AI教程(4)——启发式搜索与主程序

    通过前面几篇文章的学习,我们的四子棋程序已经有了框架.搜索几大部分,但是还有着不少问题,我们的程序只能迭代很有限的步骤,导致棋力低下,在这一篇我们将通过启发式搜索极大的优化搜索效率. 一.原因 我们之 ...