文档章节

调度器(Quartz)

学-无止境
 学-无止境
发布于 2016/09/03 12:58
字数 1691
阅读 168
收藏 2

任务调度的时机(背景)

        例如在开发购物网站时会遇到一个问题,因白天订单多流量大,为减轻网站压力要求一些不是太急的任务(如给注册用户发送广告邮件、清理日常垃圾信息等)放在凌晨流量较小时间段去执行,这个时候就需要使用到任务调度,指定在某个时间内执行某个任务

任务调度实现方式

  • 借助java.util.Timer来实现的。对于更加复杂任务调度,Timer不太容易(定时器)
  • 使用Spring的Quartz调度器可弥补Timer的不足,使开发者能完成各种复杂任务调度(调度器)

spring调度器(Quartz)

介绍

        Quartz调度器为调度工作提供更丰富的支持,与Java定时器一样,可使用Quartz指定每隔多少毫秒执行一个工作,但Quartz比Java的Timer优势在于Quartz允许调度一个工作在某个特定的时间或日期执行。

使用Quartz有两种方式实现

  • 任务类继承QuartzJobBean
  • 在配置文件中定义任务类和要执行的方法(借助:MethodInvokingJobDetailFactoryBean)

Spring实现调度器基本步骤

第一步:创建一个用于指定执行任务的QuartzJobBean子类

        QuartzJobBean实现org.quartz.Job接口。QuartzJobBean子类应当覆盖executeInternal()方法,在executeInternal()方法中定义预定的时刻应执行动作(这一步是指明做什么)

参考代码如下:CustomerQuartzJobBean.java

package www.enfp.cc.springquartz;

import java.util.Date;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class CustomerQuartzJobBean extends QuartzJobBean
{

	@Override
	protected void executeInternal(JobExecutionContext arg0)
			throws JobExecutionException
	{
		//指定需要执行的任务,这里仅仅是输出当前时间
		System.out.println("执行调度任务: (当前时间:" + new Date() + ")");
	}
}

第二步:在配置文件中进行调度器的相关配置(beans.xml)

1.配置执行工作<做什么>

        JobDetailBean是Quartz的JobDetail的子类,通过jobClass属性来设置一个Job对象,将第一步的QuartzJobBean的子类的全路径传给JobDetailBean的jobClass属性

参考代码如下:

<!-- 配置执行工作(做什么) -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
	<property name="jobClass">
		<value>www.enfp.cc.springquartz.CustomerQuartzJobBean</value>
	</property>
</bean>

2.触发器Trigger的配置(配置执行时间和执行哪个工作)<什么时间做什么>

        Quartz的Trigger类描述了调度时机和频度,Spring提供了两个触发器:SimpleTriggerBean、CronTriggerBean。

  • SimpleTriggerBean用来指定一个工作运行频度,以及(可选地)在第一次运行之前等待时间。缺点是该触发器只能指定工作执行频度,而不能准确指定何时运行
  • CronTriggerBean能更精确地控制任务的运行时间。如每晚8点发送电子邮件。

(1).使用SimpleTriggerBean调度器(属性)介绍

  • jobDetail:定义工作(做什么)
  • startDelay:服务启动后的时间延迟,单位毫秒
  • repeatInterval:重复执行任务的时间间隔,单位毫秒

参考代码如下:

<!-- 执行效果:启动任务6秒后执行任务,并且每个4秒执行一次 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
	<!-- 指定任务(做什么) -->
	<property name="jobDetail">
		<ref bean="jobDetail" />
	</property>
	<!-- 服务启动后延迟多少时间执行,单位毫秒 -->
	<property name="startDelay" value="6000"></property>
	<!-- 重复执行任务的时间间隔,单位毫秒 -->
	<property name="repeatInterval" value="4000"></property>
</bean>

(2).使用CronTriggerBean调度器(属性)介绍

  • jobDetail:定义工作(做什么)
  • cronExpression:cron表达式(指定执行时间)

     一个cron表达式有至少6个(也可能是7个)由空格分隔的时间元素。从左至右,这些元素的定义如下

  •     参数1:秒  0 - 59
  •     参数2:分钟  0-59
  •     参数3:小时  0-23
  •     参数4:月份中的日期  1-31
  •     参数5:月份 1-12或JAN-DEC
  •     参数6:星期中的日期 1-7或SUN-SAT
  •     参数7:年份1970-2099

    注意: 每一个元素都可显式规定一个值(如6),一个区间(如9-12),一个列表(如9,11,13)或一个通配符(如*)。“月份中的日期”和“星期中的日期”互斥,应通过设置一个问号(?)来表明你不想设置的那个字段

参考代码如下:

<!-- (触发器的配置)配置执行时间(或间隔)和执行哪个工作(什么时间做什么) -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
	<!-- (做哪个工作) -->
	<property name="jobDetail" ref="jobDetail"></property>
	<!-- 配置cron表达式(什么时间做) -->
	<property name="cronExpression" value="0 * 11 * * ?"></property>
</bean>

(3).启动触发器

       使用Spring的SchedulerFactoryBean类可使用list表示启动多个触发器

参考代码如下:

<!-- 启动触发器 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<property name="triggers">
		<!-- 可以启动多个触发器,所以采用list标签 -->
		<list>
			<ref bean="cronTrigger"/>
		</list>
	</property>
</bean>

第三步:测试

1.web应用中使用(在web.xml文件加载beans.xml)

2.在java 应用中使用ClassPathXmlApplicationContext类加载beans.xml

参考代码如下:SpringQuartzTest.java

package www.enfp.cc.springquartz;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringQuartzTest
{
	public static void main(String[] args)
	{
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
				"beans.xml");
	}
}

补充:

 常见一些cron表达式的例子:

  • "0 0 12 * * ?" 每天中午12点触发
  • "0 15 10 ? * *" 每天上午10:15触发
  • "0 15 10 * * ?" 每天上午10:15触发
  • "0 15 10 * * ? *" 每天上午10:15触发
  • "0 15 10 * * ? 2005" 2005年的每天上午10:15触发
  • "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
  • "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
  • "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
  • "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
  • "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
  • "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
  • "0 15 10 15 * ?" 每月15日上午10:15触发
  • "0 15 10 L * ?" 每月最后一日的上午10:15触发
  • "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
  • "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
  • "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
  • 每天早上6点
  • 0 6 * * *
  • 每两个小时
  • 0 */2 * * *
  • 晚上11点到早上8点之间每两个小时,早上八点
  • 0 23-7/2,8 * * *
  • 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
  • 0 11 4 * 1-3
  • 1月1日早上4点
  • 0 4 1 1 *

© 著作权归作者所有

学-无止境

学-无止境

粉丝 3
博文 21
码字总数 14289
作品 0
程序员
私信 提问
基于Netty+Zookeeper+Quartz调度分析

系列文章 Spring整合Quartz分布式调度 Quartz数据库表分析 Quartz调度源码分析 基于Netty+Zookeeper+Quartz调度分析 前言 前几篇文章分别从使用和源码层面对Quartz做了简单的分析,在分析的过...

ksfzhaohui
2018/09/03
812
0
xxl-job中关于quartz中的配置详解

在半个月之前,有幸看了xxl-job源码,原本打算写一篇源码分析文章。结果由于琐碎的事情干扰了,搁浅了。本篇文章先预热一下,讲下xxl-job中关于quartz知识。(本文内容参考自xxl-job官网) xxl...

cmazxiaoma
04/10
0
0
Quartz 框架快速入门(二)

尽可能的用声明式处理软件配置,其次才考虑编程式的方式。在上一篇《Quartz 框架快速入门(一)》中,如果我们要在 Job 启动之后改变它的执行时间和频度,必须去修改源代码重新编译。这种方式...

嗯哼9925
2017/12/21
0
0
Quartz的原理

Quartz API :http://www.quartz-scheduler.org/api/2.2.0/ http://www.boyunjian.com/javadoc/org.apache.servicemix.bundles/org.apache.servicemix.bundles.quartz/2.2.11/_/ 主要包含了以......

Sam_鸿发
2016/01/20
31
1
Quartz框架应用(1)

在你使用调度器之前,需要借助一些具体的例子去理解。 你可以使用SchedulerFactory类来达到程序调度的目的。 有一些Quartz框架的用户可能会将factory的实例存储在JNDI中,其他人为了便于举例...

冷冷gg
2016/12/15
100
0

没有更多内容

加载失败,请刷新页面

加载更多

c++ 虚基类

c++ 虚基类 p556

天王盖地虎626
16分钟前
10
0
Java中的面向对象

一、面向对象 面向对象和面向过程的区别 过程就是函数,就是写方法,就是方法的一种实现。 对象就是将函数,属性的一种封装。用人们思考习惯的方式思考问题。 如何自定义类 修饰符 类名{ //成...

zhiruochujian
25分钟前
3
0
k8s删除Terminating状态的命名空间

背景: 我们都知道在k8s中namespace有两种常见的状态,即Active和Terminating状态,其中后者一般会比较少见,只有当对应的命名空间下还存在运行的资源,但是该命名空间被删除时才会出现所谓的...

Andy-xu
27分钟前
20
0
seata源码阅读笔记

seata源码阅读笔记 本文没有seata的使用方法,怎么使用seata可以参考官方示例,详细的很。 本文基于v0.8.0版本,本文没贴代码。 seata中的三个重要部分: TC:事务协调器,维护全局事务和分支...

东都大狼狗
40分钟前
7
0
Rust:最小化窗口后 CPU占用率高 (winit,glutin,imgui-rust)

最近试着用 imgui-rust 绘制界面,发现窗口最小化后CPU占用会增大。 查询的资料如下: https://github.com/rust-windowing/winit/issues/783 https://github.com/ocornut/imgui/issues/1151 ...

reter
45分钟前
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部