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

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

任务调度


任务执行
任务持久化

事务

集群

监听器和插进

Quartz案例
1.找到Quartz框架的jar包

2.开始创建entity实体层定义任务的模板
package cn.entity;
public class Plan {
//时间
private String date;
//任务
private String task;
public Plan() {
super();
}
public Plan(String date, String task) {
super();
this.date = date;
this.task = task;
}
@Override
public String toString() {
return "Plan [date=" + date + ", task=" + task + "]";
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTask() {
return task;
}
public void setTask(String task) {
this.task = task;
}
}
3.定制一个泛型集合用户存储多个Plan对象,提供一个方法读取该泛型集合中的data
package cn.service; import java.util.ArrayList;
import java.util.List; import cn.entity.Plan;
/**
* 提醒服务类
* @author 景佩佩
*
*/
public class RemindService {
//01.创建一个集合,并且方法返回值是一个集合类型
public List<Plan> getPlansForToday(){
List<Plan> list=new ArrayList<Plan>();
Plan plan1=new Plan("2016年12月16日","2016最后一个月");
Plan plan2=new Plan("2016年12月18日","Quartz"); list.add(plan1);
list.add(plan2); return list;
} //02.用来打印集合中提醒内容的方法
public void printMessage(){
List<Plan> list = getPlansForToday();
for (Plan plan : list) {
//单个的plan
System.out.println("计划的时间"+plan.getDate()+"\t计划内容"+plan.getTask());
}
}
}
4.提醒业务类
package cn.quartz; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; import cn.service.RemindService;
/**
* 提醒业务
* @author 景佩佩
*
*/
//让一个普通类变成计划
public class RemindJob implements Job {
//植入service 对象
private RemindService service=new RemindService();
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
service.printMessage();
}
public RemindService getService() {
return service;
}
public void setService(RemindService service) {
this.service = service;
} }
Job接口中只有一个 execute()方法,在实现类中 实现该方法以执行具体任务。


5.真正的任务对象和触发器对象
package cn.test; import java.util.Date; import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.DateBuilder;
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.TriggerKey;
import org.quartz.impl.StdSchedulerFactory; import cn.quartz.RemindJob; public class MyQuartzTest { public static void tool() throws SchedulerException, InterruptedException{
//第一步构建Job
JobDetail job = JobBuilder.newJob(RemindJob.class)//
.withIdentity("job1", "group1")//
.build(); //第二步创建Trigger
//第一种方式 控制不太好
/* Date runTime = DateBuilder.evenMinuteDate(new Date(System.currentTimeMillis()));
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")//
.startAt(runTime).build();*/ //第二种方式 不太好
/*Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(TriggerKey.triggerKey("myTrigger", "myTriggerGroup"))
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2)
.repeatForever())
.startAt(new Date(System.currentTimeMillis()+2000))
.build();*/ //第三步绑定 JOb和Trigger
// First we must get a reference to a scheduler
//创建调度者工厂
SchedulerFactory sf = new StdSchedulerFactory();
//创建一个调度者
Scheduler sched = sf.getScheduler();
//注册并进行调度
sched.scheduleJob(job, trigger);
//启动调度
sched.start();
/*Thread.sleep(3000);
* //关闭调度
sched.shutdown();*/
} public static void main(String[] args) throws SchedulerException, InterruptedException {
tool();
System.out.println("呵呵");
}
}
第一种方式:


第二种方式:

6.使用CronTrigger
CronTrigger也是Trigger的子类
CronTrigger和SimpleTrigger的对比

CronTrigger允许用户更精准地控制任务的运行日期和时间,而不仅仅是定义工作的频度
CronTrigger通过Cron表达式定义准确的运行时间点。创建CronTrigger的语法如下:

7.Cron表达式
要使用CronTrigger,必须掌握Cron表达式
Cron表达式由6~7个由空格分隔的时间元素组成。第7个元素可选

Cron表达式的每个字段,都可以显式地规定一个值(如49)、一个范围(如1-6)、一个列表(如1,3,5)或者一个通配符(如*)
8.Cron表达式有几个特殊的字符,说明如下
“ - ”:中划线,表示一个范围
“ , ”:使用逗号间隔的数据,表示一个列表
“ * ”:表示每一个值,它可以用于所有字段。例如:在小时字段表示每小时
“ ? ”:该字符仅用于“月份中的哪一天”字段和“星期几”字段,表示不指定值
“ / ”:通常表示为x/y,x为起始值,y表示值的增量。
“ L ”:表示最后一天,仅在日期和星期字段中使用
“ # ”:只能用于“星期几”字段,表示这个月的第几个周几。例如:“6#3”指这个月第三个周五
9.Cron表达式案例


测试:
package cn.test; import java.util.Date; import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.DateBuilder;
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.TriggerKey;
import org.quartz.impl.StdSchedulerFactory; import cn.quartz.RemindJob; public class MyQuartzTest { public static void tool() throws SchedulerException, InterruptedException{
//第一步构建Job
JobDetail job = JobBuilder.newJob(RemindJob.class)//
.withIdentity("job1", "group1")//
.build(); //第二步创建Trigger
/**
* 2016年每月的第三个星期六上午10:18触发 0 18 10 ? * 6#3 2016
*/
CronTrigger trigger=TriggerBuilder.newTrigger()//
.withIdentity("myTrigger", "myTriggerGroup")//
.withSchedule(CronScheduleBuilder.//
cronSchedule("0 18 10 ? * 6#3 2016")).build(); //第三步绑定 JOb和Trigger
// First we must get a reference to a scheduler
//创建调度者工厂
SchedulerFactory sf = new StdSchedulerFactory();
//创建一个调度者
Scheduler sched = sf.getScheduler();
//注册并进行调度
sched.scheduleJob(job, trigger);
//启动调度
sched.start();
} public static void main(String[] args) throws SchedulerException, InterruptedException {
tool();
System.out.println("呵呵");
}
}

Spring Quartz实现任务调度的更多相关文章
- spring+quartz的任务调度
公司网站有个功能是自动投标,还有定时更新用户的排名信息,这些都是spring+quartz实现的. 手机了一些资料,做一个小demo,加深理解,记录一下,以后使用的时候不会出什么问题. 需要的包,主要 ...
- spring timetask 定时任务调度
作者:Garry1115 定时任务调度即在设置的特定时间执行特定的任务,不需要人工干预. spring timertask spring 自身所带定时任务类,不需要引入第三方jar包,使用方式如下: ...
- 任务调度--spring下的任务调度quartz
之前写过Timer实现任务调度,这篇文章用来写一下在spring下使用quartz实现任务调度,直接上代码: 定义任务对象: package com; /** * 1. 定义任务对象 * * @aut ...
- 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出
1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法 Shiro框架内部整合好缓存管理器, ...
- spring quartz分布式任务计划
spring quartz分布式任务计划 环境: 通过maven管理的spring mvc工程,且已经成功连接数据库. 数据库表结构 /*Table structure for table `qrtz ...
- Spring Quartz
Spring Quartz Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在Spring中怎样配置Quartz: 首先我们来写一个被调度的类: pac ...
- Spring + Quartz配置实例
Spring为创建Quartz的Scheduler.Trigger和JobDetail提供了便利的FactoryBean类,以便能够在Spring 容器中享受注入的好处.此外Spring还提供了一些便 ...
- 项目ITP(五) spring4.0 整合 Quartz 实现任务调度
前言 系列文章:[传送门] 项目需求: 二维码推送到一体机上,给学生签到扫描用.然后需要的是 上课前20分钟 ,幸好在帮带我的学长做 p2p 的时候,接触过.自然 quartz 是首选.所以我就配置了 ...
- 【示例】Spring Quartz入门
JAVA 针对定时任务,有 Timer,Scheduler, Quartz 等几种实现方式,其中最常用的应该就是 Quartz 了. 一. Quartz的基本概念 在开始之前,我们必须了解以下的几个基 ...
随机推荐
- ASP.NET Aries 入门开发教程4:查询区的下拉配置
背景: 今天去深圳溜达了一天,刚回来,看到首页都是微软大法好,看来离.NET的春天就差3个月了~~ 回到正题,这篇的教程讲解下拉配置. 查询区的下拉配置: 1:查询框怎么配置成下拉? 在配置表头:格式 ...
- 让姑姑不再划拳 码农也要有原则 : SOLID via C#
“姑娘,别这样.我们是有原则的.” “一个有原则的程序猿是不会写出 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去.” “对,是时候和那些只会滚键盘的麻瓜不同了, ...
- sublime常用快捷键
自己觉得比较实用的sublime快捷键: Ctrl + / ---------------------注释 Ctrl + 滚动 --------------字体变大/缩小 Ctrl + N----- ...
- web全栈开发之网站开发二(弹出式登录注册框前端实现-类腾讯)
这次给大家分享的是目前很多网站中流行的弹出式登录框,如下面的腾讯网登录界面,采用弹出式登录的好处是大大提升了网站的用户体验和交互性,用户不用重新跳转到指定的页面就能登录,非常方便 先来个演示地址 要实 ...
- Yeoman 官网教学案例:使用 Yeoman 构建 WebApp
STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...
- javascript之Object.defineProperty的奥妙
直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...
- HDU1671——前缀树的一点感触
题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...
- 安装eclipse的maven插件
我们团队用maven来管理项目需要的库文件,其实以前都没听过maven,第一次接触这个,师兄要我直接去装下这个,开始以为还挺简单的,没想到中间遇到了一些小麻烦,现在把我成功安装maven的过程分享下, ...
- CSS 3 学习——渐变
通过CSS渐变创建的是一个没有固定比例和固定尺寸的<image>类型,也就是说是一张图片,这张图片的尺寸由所应用的元素的相关信息决定.凡是支持图片类型的CSS属性都可以设置渐变,而支持颜色 ...
- document.compatMode
在我电脑屏幕上显示的 电脑是 1920*1080这是在document.compatMode:css1Compat模式 window.screen.availWidth 1920 window.scr ...