Quartz框架(第一版)
任务调度
在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发、线程池维护、运行时间规则解析、运行现场的保护以恢复等方面 Quartz框架是一个开源的企业级任务调度服务,已经被作为任务调度的良好解决方案.

Quartz框架核心
Quartz对任务调度进行了高度抽象,提出了3个核心概念,并在org.quartz包中通过接口和类进行了描述 任务:就是执行的工作内容。Quartz提供Job接口来支持任务定义 触发器:定义触发Job执行的时间触发规则。Quartz提供Trigger类及其子类支持触发器功能, 调度器:Quartz提供了Scheduler接口,将工作任务和触发器绑定,保证任务可以在正确的时间执行
运行环境

任务调度


任务执行
任务持久化

事务

集群

监听器和插进

下面我们直接来看例子
我们创建一个计划类 Plan
开始创建entity实体层定义任务的模板
public class Plan {
private String date;//时间
private String task;//任务
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Plan [date=" + date + ", task=" + task + "]";
}
public Plan() {
super();
// TODO Auto-generated constructor stub
}
public Plan(String date, String task) {
super();
this.date = date;
this.task = task;
}
我们创建一个提醒服务类RemindService
定制一个泛型集合用户存储多个Plan对象,提供一个方法读取该泛型集合中的data
*/
public class RemindService {
public void printPlan(String userName){
List<Plan> plansFormToday=getPlansFormToday(userName);
System.out.println(userName+"//");
for (Plan plan : plansFormToday) {
System.out.println(plan+"\\\\");
}
}
private List<Plan> getPlansFormToday(String userName) {
//模拟数据库查询,仅说明问题
List<Plan> list=new ArrayList<Plan>();
list.add(new Plan("2016-11-3 14:31:11","陶研会|地点:会议室C01"));
list.add(new Plan("2016-11-3 14:31:20","总裁办公室|地点:总裁办公室"));
return list;
}
我们创建一个任务调度类RemindJob
/**
* 提醒业务类
* @author Admin
*
*/
public class RemindJob implements Job {
private RemindService service=new RemindService();
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
service.printPlan("你好!");
}
/**
* @return the service
*/
public RemindService getService() {
return service;
}
/**
* @param service the service to set
*/
public void setService(RemindService service) {
this.service = service;
}
核心代码解析:

Job接口中只有一个 execute()方法,在实现类中 实现该方法以执行具体任务。



通过参数 JobExecutionContext 可以获取调度上下文的各 种信息,如:任务名称等

在原RemindJob的execute()方法中添加以下代码,可以获取该任务的名称、 绑定的触发器的名称和每次任务触发时间
//获取用户信息
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String value = (String)dataMap.get("happykey");
System.out.println(value);
System.out.println("TriggerName\t"+context.getTrigger().getKey().getName());
System.out.println("JobName\t"+context.getJobDetail().getKey().getName());
真正的任务对象和触发器对象 Test
public class Test {
public static void main(String[] args) throws SchedulerException {
doRemind();
}
public static void doRemind() throws SchedulerException{
JobDetail job = JobBuilder.newJob(RemindJob.class)
.withIdentity("job1", "group1").build();//创建一个任务
/**
* 创建触发器
* 第一种方式 不太好
*/
/*SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "myTriggerGroup").
withSchedule(SimpleScheduleBuilder.simpleSchedule().
withIntervalInSeconds(3).
repeatForever()).
startAt(new Date(System.currentTimeMillis()+1000)).build();*/
/**
* 创建触发器
* 第二种 方式 非常好
* 可以 好用 2013年每月的第三个星期五上午10:30触发 0 30 10 ? * 6#3 2013
* 2016年每月的第一个星期四下午16:17触发 0 17 16 ? * 5#1 2016
* 每天15点到16点每5分钟运行一次,此外,每天17点到18点每5分钟运行一次
*/
CronTrigger trigger=TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "myTriggerGroup")
.withSchedule(CronScheduleBuilder.cronSchedule("0 18 16 ? * 5#1 2016")).build();
SchedulerFactory sf=new StdSchedulerFactory();//创建调度者工厂
Scheduler scheduler = sf.getScheduler();//创建一个调度者
scheduler.scheduleJob(job,trigger);//注册并进行调度
scheduler.start();//启动调度
//Thread.sleep(millis)
//scheduler.shutdown();//关闭调度
}
核心代码解析:

这是通过JobDetail创建一个任务实例。

还可以通过JobDetail的JobDataMap对象来进行初始数据的设置,如传入需要提醒的用户姓名
public class TestJob {
public void doRemind() throws SchedulerException, InterruptedException {
JobDetail job = new JobDetail("remindJob", "group1", RemindJob.class);
// 获取和任务关联的JobDataMap对象
JobDataMap dataMap = job.getJobDataMap();
dataMap.put("user", "张三"); // 在JobDataMap对象中设置用户数据
// 省略原有程序代码
}
}

JobBuilder类

使用SimpleTrigger创建一个触发器
SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "myTriggerGroup").
withSchedule(SimpleScheduleBuilder.simpleSchedule().
withIntervalInSeconds().
repeatForever()).
startAt()).build();
创建一个调度器
SchedulerFactory sf=new StdSchedulerFactory();//创建调度者工厂
Scheduler scheduler = sf.getScheduler();//创建一个调度者
注册任务和触发器
scheduler.scheduleJob(job,trigger);//注册并进行调度
scheduler.start();//启动调度
启动和关闭调度
sched.start(); sched.shutdown();
上面的例子,基本算是完成了任务调度。
期待 第二版
Quartz框架(第一版)的更多相关文章
- Quartz框架
Quartz框架 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz 允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多 ...
- 【淘淘】Spring整合Quartz框架
我在外面工作实习的时候,我们做的项目是一个日报子系统,也就是定时定点为公司生成一些报表数据还有一些数据反馈.这时候我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.当时,我做 ...
- java任务调度quartz框架的小例子
quartz是一个开源的作业调度框架,当然,java可以使用Timer来实现简单任务调度的功能,但Timer是单线程的设计方案,使得一个任务延迟会影响到其他的任务.java也可以使用Scheduled ...
- Quartz框架简介
一.Quartz概述: Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间.其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高 ...
- [译]Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架
第一课:开始使用Quartz框架 在你使用调度器之前,需要借助一些具体的例子去理解(谁愿意只是猜啊?).你可以使用SchedulerFactory类来达到程序调度的目的.有一些Quartz框架的用户可 ...
- Spring框架下的定时任务quartz框架的使用
手头的这个项目需要用到定时任务,但之前没接触过这东西,所以不太会用,从网上找资料,大致了解了一下,其实也不难.Java的定时任务实现有三种,一种是使用JDK自带的Timer那个类来实现,另一种是使用q ...
- Quartz框架学习(1)—核心层次结构
Quartz框架学习 Quartz(任务调度)框架的核心组件: job:任务.即任务调度行为中所要调度的对象. trigger:触发器.是什么促使了一个任务的调度?当然是时间.这也算事件驱动类型程序. ...
- 使用Quartz框架定时发送预警邮件
1. Quartz定时发送预警邮件 1.1. 需求及实现思路 定时查询库存预警信息,一旦存在库存预警的商品,则发邮件通知相关人员 1.2. Quartz框架 Quartz是OpenSymph ...
- Quartz框架多个trigger任务执行出现漏执行的问题分析--转
原文地址:http://blog.csdn.net/dailywater/article/details/51470779 一.问题描述 使用Quartz配置定时任务,配置了超过10个定时任务,这些定 ...
随机推荐
- js刷新页面方法大全
如何实现刷新当前页面呢?借助js你将无所不能. 1,reload 方法,该方法强迫浏览器刷新当前页面.语法:location.reload([bForceGet]) 参数: bForceGet, ...
- Android 关于ijkplayer
基于ijkplayer封装支持简单界面UI定制的视频播放器 可以解析ts格式的so库 怎样编译出可以解析ts等格式的so库?就是编译的时候需要在哪一步修改配置? 一些电视台的m3u8 CCTV1综合, ...
- T-SQL学习记录
T-sql是对SQL(structure query language )的升级.可以加函数. 系统数据库:master管理数据库.model模版数据库,msdb备份等操作需要用到的数据库,tempd ...
- 技术笔记:Indy IdSMTP支持腾讯QQ邮箱邮件发送
1.腾讯QQ邮箱的授权码问题 因为腾讯邮箱折腾了个底朝天,其要搞什么授权码登录第三方客户端,否则会报这个错误: 'Error: 请使用授权码登录.详情请看: http://service.mail.q ...
- Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值
第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...
- java运行时获得泛型类型
引言 众所周知,java泛型最重要的特征是泛型擦除,所有泛型在编译时会转换成Object所以在java中运行时无法获得泛型的类型. 但是其实以上的规则是针对方法的内部变量的,如果是其他形式的泛型其实是 ...
- WEB 基础知识(一)
1. 系统架构 1.1 B/S系统架构 1.2 C/S系统架构 1.3 对比与区别 1.3.1 概述 C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过 ...
- [原创]MYSQL的简单入门
MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...
- JS中的数学计算<之简单实例讲解>
1.取余数 % var a=10%3; //a=1 2.取绝对值 Math.abs() var a=Math.abs(-102.1); var b=Math.abs(102.1); //a=10 ...
- 开源Word读写组件DocX 的深入研究和问题总结
一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...