任务调度quartz整理
一张图,了解quartz运行机制:
此图表示:Scheduler是容器,Trigger是多个触发器,jobDetail是多个任务,Calendar是多个日历。
jobDetail任务,需要指定类实现Job接口,并重写execute方法。并且Jobdetail初始化时需要指定任务执行的运行时类。
package com.lec.util.job; import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory; import com.lec.assurance.utils.StringHandler; /**
* CronTrigger任务调度器
* @author lcy
* Dec 1, 2011
*/
public class CronTriggerRunner {
private static SchedulerFactory sf = new StdSchedulerFactory(); /**
* 根据任务名和任务组名查询一个任务
* @param jobName
* @param jobGroupName
* @return
* @throws SchedulerException
*/
public static JobDetail getJob(String jobName,String jobGroupName) throws SchedulerException{
Scheduler sched = sf.getScheduler();
JobDetail jobDetail=sched.getJobDetail(jobName, jobGroupName);
if(jobDetail != null){
return jobDetail;
}
return null;
} /**
* 添加一个CronTrigger定时任务
* @param jobName 任务名
* @param jobGroupName 任务组名
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
* @param job 任务
* @param time 时间设置,参考quartz说明文档
* @param params 传递参数
* @throws SchedulerException
* @throws ParseException
*/
public static void addJob(String jobName,String jobGroupName,String triggerName,
String triggerGroupName,String time,HashMap<String,Object> params,
Job jobClass) throws SchedulerException, ParseException{
Scheduler sched = sf.getScheduler();
JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass.getClass());//任务名,任务组,任务执行类
if(params != null){
jobDetail.getJobDataMap().put("params",params);
}
//触发器
CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);//触发器名,触发器组
trigger.setCronExpression(time);//触发器时间设定
sched.scheduleJob(jobDetail,trigger);
if(!sched.isShutdown())
sched.start();
} /**
* 添加一个SimpleTrigger定时任务
* @param jobName 任务名
* @param jobGroupName 任务组名
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
* @param startTime 开始时间
* @param repeatInterval 间隔时间
* @param repeatCount 调用次数
* @param jobClass 任务
* @param params 传递参数
* @throws SchedulerException
*/
public static void addJob(String jobName,String jobGroup,
String triggerName,String triggerGroup,Date startTime,
Integer repeatInterval,Integer repeatCount,Job jobClass,
HashMap<String,Object> params) throws
SchedulerException{
JobDetail jobDetail = new JobDetail(jobName, jobGroup, jobClass.getClass());
if(params != null){
jobDetail.getJobDataMap().put("params",params);
}
//触发器
SimpleTrigger simpleTrigger = new SimpleTrigger(triggerName, triggerGroup);
//设置开始时间
simpleTrigger.setStartTime(startTime);
//设置间隔时间
simpleTrigger.setRepeatInterval(repeatInterval);
//设置调用次数
simpleTrigger.setRepeatCount(repeatCount); Scheduler sched = sf.getScheduler();
sched.scheduleJob(jobDetail,simpleTrigger);
if(!sched.isShutdown())
sched.start();
} /**
* 根据任务名和任务组名修改任务的触发时间
* @param jobName 任务名
* @param jobGroupName 任务组名
* @param time
* @throws SchedulerException
* @throws ParseException
*/
public static void modifyJobTime(String jobName,String jobGroupName,String time)
throws SchedulerException, ParseException{
Scheduler sched = sf.getScheduler();
Trigger[] trigger = sched.getTriggersOfJob(jobName,jobGroupName);
if(trigger != null){
for(int i=0;i<trigger.length;i++){
((CronTrigger)trigger[i]).setCronExpression(time);
sched.resumeTrigger(trigger[i].getName(),trigger[i].getGroup());
}
}
} /**
* 根据触发器名修改一个任务的触发时间
* @param triggerName触发器名
* @param triggerGroupName触发器组名
* @param time
* @throws SchedulerException
* @throws ParseException
*/
public static void modifyTriggerTime(String triggerName,String triggerGroupName,
String time) throws SchedulerException, ParseException{
Scheduler sched = sf.getScheduler();
Trigger trigger = sched.getTrigger(triggerName,triggerGroupName);
if(trigger != null){
//修改时间
((CronTrigger)trigger).setCronExpression(time);
//重启触发器
sched.resumeTrigger(triggerName,triggerGroupName);
}
} /**
* 移除任务
* @param jobName任务名
* @param jobGroupName任务组名
* @param triggerGroupName触发器组名
* @throws SchedulerException
*/
public static void removeJob(String jobName,String jobGroupName,String triggerGroupName)
throws SchedulerException{
Scheduler sched = sf.getScheduler();
String[] triggerNames = sched.getTriggerNames(triggerGroupName);
if(triggerNames!=null){
for(int i=0;i<triggerNames.length;i++){
sched.pauseTrigger(triggerNames[i],triggerGroupName);//停止触发器
sched.unscheduleJob(triggerNames[i],triggerGroupName);//移除触发器
}
}
sched.deleteJob(jobName,jobGroupName);//删除任务
} /**
* 移除一个任务
* @param jobName任务名
* @param jobGroupName任务组名
* @param triggerName触发器名
* @param triggerGroupName触发器组名
* @throws SchedulerException
*/
public static void removeJob(String jobName,String jobGroupName,
String triggerName,String triggerGroupName)
throws SchedulerException{
Scheduler sched = sf.getScheduler();
sched.pauseTrigger(triggerName,triggerGroupName);//停止触发器
sched.unscheduleJob(triggerName,triggerGroupName);//移除触发器
sched.deleteJob(jobName,jobGroupName);//删除任务
} /**
* 停止一个任务 需要注意的是:这里停止的job必须是实现InterruptableJob的
* @param jobName
* @param jobGroupName
* @throws SchedulerException
*/
public static void stopJob(String jobName,String jobGroupName) throws SchedulerException {
Scheduler sched = sf.getScheduler();
sched.interrupt(jobName, jobGroupName);
} /**
* 计算时间表达式
* @param second 秒
* @param minute 分
* @param hour 时
* @param day 日期
* @param month 月份
* @param week 星期
* @param year 年份
* @param isContactYear 是否包括年份
* @return
*/
public static String getCexpress(String second,String minute,String hour,
String day,String month,String week,String year,boolean isContactYear) {
String cexpress="";
//秒,默认为"0" 取值范围:0-59
if(StringHandler.isValidStr(second)){
cexpress+=Integer.parseInt(second)+" ";
}else{
cexpress+="0 ";
} /**
* 分 取值范围:0-59
* 默认为"*" 表示每一分钟
* 如果是0 12 表示整12:00触发
* 如果是0/5 12 表示在每天下午12点到12:55期间的每5分钟触发 ,
* 如果是0-5 12 表示12:00到12:05期间的每1分钟触发
* 如果是10,15 12 表示12:10和12:15触发
*/
if(StringHandler.isValidStr(minute)){
cexpress+=minute+" ";
}else{
cexpress+="* ";
} /**
* 小时 取值范围:0-23
* 默认为"*" 表示每一个小时
* 如果是0 表示凌晨触发
* 如果是0-5 表示凌晨到5:00期间
* 如果是10,15 表示10:00和15:00触发
*/
if(StringHandler.isValidStr(hour)){
cexpress+=hour+" ";
}else{
cexpress+="* ";
} /**
* 日期 取值范围:1-31
* 默认为"*" 表示每天
* 如果是15 表示每个月的15号
* 如果是L 表示每个月最后一天
* 注:在指定了星期的时候,把日期这里设置为"?"
*/
if(StringHandler.isValidStr(day)){
cexpress+=day+" ";
}else{
cexpress+="* ";
} /**
* 月份 取值范围:1-12
* 默认为"*" 表示每个月
* 如果是 12 表示12月份
*/
if(StringHandler.isValidStr(month)){
cexpress+=month+" ";
}else{
cexpress+="* ";
} /**
* 星期 取值范围:1-7 MON,TUE,WED,THU,FRI,SAT,SUN 其中1表示星期日,以此类推
* 默认为"?"
* 如果是WED 表示每个星期三
* 如果是MON-FRI 表示星期一到星期五
* 如果是6L 表示每月最后一个星期五
* 如果是6#3 表示每月第三个星期五
*/
if(StringHandler.isValidStr(week)){
cexpress+=week+" ";
}else{
cexpress+="? ";
} //如果包括年份
if(isContactYear){
/**
* 年份 取值范围:1970-2099
* 默认值为空
* 如果是2010 表示只有2010年触发时间
* 如果是2010,2020 表示只有2010
*/
if(StringHandler.isValidStr(year)){
cexpress+=year;
}
} return cexpress;
} public static void main(String [] args){
try {
/*--------------------创建一个指定时间执行的job-----------------------*/
JobDetail jobDetail = new JobDetail("fundsrecord_jobname_folkholdersId1",
"fundsrecord_jobgroupname_folkholdersId1",FundsrecordJob.class);
// ①-1:创建CronTrigger,指定组及名称
CronTrigger cronTrigger = new CronTrigger("fundsrecord_triggername_folkholdersId1",
"fundsrecord_triggergroupname_folkholdersId1");
// ①-2:定义Cron表达式
String timeexp = "";
String second = "0";
String minute = "15";
String hour = "0";
String day = "L";//当月的最后一天
String month = "";
String week = "?";
month = "6,12";
timeexp = getCexpress(second, minute, hour, day, month, week, null, false); if(!"0 * * * * ?".equals(timeexp)){//如果没有设置时间则不执行
CronExpression cexp = new CronExpression(timeexp);
// ①-3:设置Cron表达式
cronTrigger.setCronExpression(cexp);
Scheduler scheduler = sf.getScheduler();
scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.start();
} /*--------------------创建一个间隔一定时间执行的job-----------------------*/
String jobName = "fundsrecord_jobname_folkholdersId2";
String jobGroupName = "fundsrecord_jobgroupname_folkholdersId2";
String triggerName = "fundsrecord_triggername_folkholdersId2";
String triggerGroupName = "fundsrecord_triggergroupname_folkholdersId2";
Date beginTime = new Date(System.currentTimeMillis() + 60000L);//当前时间过60秒钟后开始
Integer repeatInterval = 5000;//以毫秒为单位
Integer repeatCount = 0;
HashMap<String, Object> map = new HashMap<String,Object>();
map.put("folkholdersId", "2");
try {
CronTriggerRunner.addJob(jobName,jobGroupName,triggerName,
triggerGroupName,beginTime,repeatInterval,
repeatCount,new FundsrecordJob(),map);
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
} }
package com.lec.util.job; import java.util.HashMap; import org.quartz.InterruptableJob;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
import org.quartz.UnableToInterruptJobException; /**
* 任务调度器
* @author lcy
* May 24, 2011
*/
public class FundsrecordJob implements InterruptableJob { @Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap map = context.getMergedJobDataMap();
Object obj = map.get("params");
if(obj != null ){
HashMap<String,Object> params = (HashMap<String,Object>)obj;
dojob();//在这个任务调度器里面需要执行的方法
Long folkholdersId = Long.parseLong((String)params.get("folkholdersId"));
try {
CronTriggerRunner.stopJob("fundsrecord_jobname_folkholdersId"+folkholdersId,
"fundsrecord_jobgroupname_folkholdersId"+folkholdersId);//停止本次job
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
public void interrupt() throws UnableToInterruptJobException { } }
任务调度quartz整理的更多相关文章
- spring 任务调度quartz
简单记录一下spring任务调度quartz的例子 首先添加包 quartz-2.2.3.jar 然后写个简单的TestJob类 package com.job; import java.util.D ...
- java任务调度quartz框架的小例子
quartz是一个开源的作业调度框架,当然,java可以使用Timer来实现简单任务调度的功能,但Timer是单线程的设计方案,使得一个任务延迟会影响到其他的任务.java也可以使用Scheduled ...
- 任务调度 QUARTZ
任务调度在目前的JAVA应用程序中运用的十分普遍,故掌握QUARTZ是必备的技能 闲话少说,上官网:http://www.quartz-scheduler.org/ 下载最新1.80资源包 commo ...
- 任务调度 -----> quartz 不同时间间隔调度任务
Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运 ...
- 分布式任务调度——quartz + spring + 数据库
项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻 ...
- 任务调度--spring下的任务调度quartz
之前写过Timer实现任务调度,这篇文章用来写一下在spring下使用quartz实现任务调度,直接上代码: 定义任务对象: package com; /** * 1. 定义任务对象 * * @aut ...
- spring中的任务调度Quartz
Spring 整合 Quartz 任务调度 主要有两种方式. Quartz的官网:http://www.quartz-scheduler.org/ 这两种只是一些配置文件简单配置就OK了,但是根本无法 ...
- 任务调度 Quartz 学习(一) SimpleTrigger
概述: 在实际开发过程中,会遇到很多任务调度的需求. 比如说:某网站要在每周一上午9点更新网站数据,并发邮件通知用户: 再比如某论坛需求:每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积 ...
- 任务调度Quartz.Net之Windows Service
这个应该是关于Quartz.Net使用的最后一篇文章了,之前的介绍都是基于Web的,这种实现任务调度的方式很少见,因为不管是MVC.WebApi还是WebService,它们都需要寄宿在IIS上运行, ...
随机推荐
- python pip的安装流程,以及使用pip更新,卸载第三方模块
在Python的学习过程中,肯定会遇到很多安装模块的地方,可以使用easy_install安装,但是easy_install相对于pip而言,最大的缺陷就是它所安装的模块是不能够卸载的,其他功能是和p ...
- Django--缓存、信号、序列化
一 Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的 ...
- 【转】logstash配置java环境
1.bin/logstash,新增 JAVA_CMD=/home/admin/soft/jdk1.8.0_121/bin JAVA_HOME=/home/admin/soft/jdk1.8.0_121 ...
- Ubuntu设置中文-以及-安装拼音输入法
2017-11-12更新 安装搜狗拼音: http://blog.csdn.net/iamplane/article/details/70447517 ------------------------ ...
- pyqt加载图片
使用QPixmap可以加载图片,但是图片只能是标准二进制文件格式: bmp,gif,ico,jpeg,jpg,mng,pbm,pgm,png,ppm,svg,svgz,tga,tif,tiff,xbm ...
- python学习笔记(3)--IDLE双击运行后暂停
本来想找一个python的IDE什么的,用过pycharm,vs装python插件,软件都太大了,习惯了用sublime写html,js这样的简直受不了. 一直坚持用着python自带的IDLE,不过 ...
- 基于HTML5 Canvas 实现的 Loading 效果
Sonic.js 是一个很小的 JavaScript 类,用于创建基于 HTML5 画布的加载图像.更强大的是 Sonic.js 还提供了基于现成的例子的创建工具,可以帮助你实现更多自定义的(Load ...
- 微信小程序7 - 页面命名规范
/pages/{module}/{page}/index.js 这个是目录结构 所有单个页面(Page)目录内, 都叫做index,如 index.js index.wxss ,不需要起其他名 ...
- JavaScript的gzip静态压缩方法记录
传统的JS压缩(删除注释,删除多余空格等)提供的压缩率有时还是不尽不意,幸亏现在的浏览器都支持压缩传输(通过设置http header的Content-Encoding=gzip),可以通过服务器的配 ...
- getRequestDispatcher 和sendRedirect区别及路径问题
getRequestDispatcher 和sendRedirect区别 getRequestDispatcher是服务器内部跳转,地址栏信息不变,只能跳转到web应用内的网页. sendRedi ...