使用Quartz创建定时任务
项目开发中经常需要定时循环执行某些任务
比如定时发送报表,定时发送邮件,亦或者定时清理缓存,定时更新数据等等
有些时候可以简单地利用Windows Server的计划任务执行程序
Linux也有相应的计划任务配置
但如果碰到比较复杂的循环定时
比如周一到周五的8点到18点,每隔1小时发送报表邮件
或者每个月的最后一个周六的晚上24:00对数据库进行备份等等
这时候我们需要一个稳定、灵活、轻量级的JAVA作业调度框架
Quartz呼之欲出
官网地址:http://www.quartz-scheduler.org/downloads
这个地址可能被墙,最新版本是2.2版
使用Quartz框架可以很方便实现复杂时间节点的作业调度
它的cron表达式相当好用,简单几个字符就可以制定您能想象出的任何时间规则
下面是博主使用简单代码,实现使用Quartz框架的作业调度
package com.newflypig.quartz; import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties; import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory; /**
* 使用Quartz创建定时任务,while循环一直执行下去
* @author newflypig
* time:2015年10月27日
* TODO
*
*/ public class QuartzDemo { public static void main(String[] args) throws Exception{
//读取properties配置文件
Properties prop=new Properties();
prop.load(QuartzDemo.class.getResourceAsStream("/set.properties"));
String toAccountId=prop.getProperty("toAccountId","fd60e46db0dc119cfea740c3375fd7c4");
String cron=prop.getProperty("cron","0/10 * 8-18 * * ?");
//创建Quartz的计划任务
Scheduler sched = new StdSchedulerFactory().getScheduler();
//配置计划任务的工作类名,这个类需要实现Job接口,在execute方法中实现所需要做的工作
JobDetail job = newJob(ExportExcelAndPostInYixin.class).build();
//向工作类传递参数
job.getJobDataMap().put("toAccountId",toAccountId);
//配置计划任务的定时器
Trigger trigger = newTrigger().withSchedule(cronSchedule(cron)).build(); Date date=sched.scheduleJob(job, trigger);//获得首次将要执行计划任务的时间,待会儿println出来
sched.start();//开始执行 System.out.println("first time run at:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
//无限循环下去
boolean flag=true;
while(flag){
Thread.sleep(24*3600*1000);
}
sched.shutdown();
}
}
下面给一个博主自己定时发送Excel报表到易信客户单的Job示例
package com.newflypig.quartz; import java.text.SimpleDateFormat;
import java.util.Date; import com.newflypig.excel.OpenExcelDemo;
import com.newflypig.jpg.DrawFromExcel;
import com.newflypig.post.SendPostToYixin; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; /**
* 导出Excel到PNG,并调用易信接口发送POST请求,推送PNG图片到指定好友
* @author newflypig
* time:2015年10月27日
* TODO
*
*/
public class ExportExcelAndPostInYixin implements Job { @Override
public void execute(JobExecutionContext arg) throws JobExecutionException {
String[] time=getTimeStr();
String toAccountId=arg.getJobDetail().getJobDataMap().getString("toAccountId");
String access_token=arg.getJobDetail().getJobDataMap().getString("access_token");//修改Excel模板
try {
new OpenExcelDemo().doOpenExcel(...);
} catch (Exception e1) {
e1.printStackTrace();
} //将Excel绘制成PNG
String exportPNGPath=dirPath + time[1] + ".png";
DrawFromExcel dfe=new DrawFromExcel();
dfe.setExportPNGPath(exportPNGPath);
dfe.setFileName(fileName);
dfe.setSheetName(sheetName);
dfe.setFromIndex(fromIndex);
dfe.setToIndex(toIndex);
try {
dfe.draw();
} catch (Exception e1) {
e1.printStackTrace();
} String pngFileName=time[1];
try {
SendPostToYixin.doPost(toAccountId,access_token,pngFileName,urlPath);
} catch (Exception e) {
e.printStackTrace();
}
} public String[] getTimeStr() {
String[] time = new String[2];
Date date=new Date();
time[0]=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
time[1]=new SimpleDateFormat("yyyyMMddHHmmss").format(date);
return time;
}
}
至此就完成整个作业调度的结构
首先主程序中创建Scheduler计划任务,配置Job工作类,配置Trigger定时器,然后执行Scheduler
然后编写Job工作类,实现Job接口,也就是定义具体的execute函数
在讲一讲cron表达式,在上面的代码中,cron表达式是“0/10 * 8-18 * * ?”这样一组字符串
我们可以这样看
0/10 * 8-18 * * ?
秒 分 时 日 周 月(年,最后一个年份可以隐藏不写)
从左到右依次是上面的时间维度,这组字符串的含义是:
每10秒执行一次,分钟不限制,时间控制在8点-18点,日期,周数,月份,年度都不限制
其中用*表示在此维度上任意一个值都需要执行,用?表示在此维度上不限制,?只能用在日、周、月维度
第一个维度使用0/10表示每隔10秒执行一次,并且初试时间是0秒,依次执行时间将是0、10、20、30、40、50秒
如果我们改成3/10,表示初始时间是3秒,依次执行时间将是3、13、23、33、43、53秒
更详细的cron表达式大家可以到http://www.cnblogs.com/sunjie9606/archive/2012/03/15/2397626.html系统地学一下
使用Quartz创建定时任务的更多相关文章
- JAVAEE——BOS物流项目13:Quartz概述、创建定时任务、使用JavaMail发送邮件、HighCharts概述、实现区域分区分布图
1 学习计划 1.Quartz概述 n Quartz介绍和下载 n 入门案例 n Quartz执行流程 n cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用Jav ...
- .net core+topshelf+quartz创建windows定时任务服务
.net core+topshelf+quartz创建windows定时任务服务 准备工作 创建.net core 控制台应用程序,这里不做过多介绍 添加TopShelf包:TopShelf: 添加Q ...
- Quartz.net 定时任务之Cron表达式
一.cron表达式简单介绍和下载 1.在上一篇博客"Quartz.net 定时任务之简单任务"中,我简单介绍了quartz的使用,而这篇博客我将介绍cron的具体使用(不足之处望大 ...
- Spring Boot整合Quartz实现定时任务表配置
最近有个小项目要做,spring mvc下的task设置一直不太灵活,因此在Spring Boot上想做到灵活的管理定时任务.需求就是,当项目启动的时候,如果有定时任务则加载进来,生成schedule ...
- springboot整合Quartz实现定时任务
1.maven依赖: <!--quartz--> <dependency> <groupId>org.quartz-scheduler</groupId> ...
- Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置
Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...
- SpringBoot创建定时任务
之前总结过spring+quartz实现定时任务的整合http://www.cnblogs.com/gdpuzxs/p/6663725.html,而springboot创建定时任务则是相当简单. (1 ...
- Spring Boot集成quartz实现定时任务并支持切换任务数据源
org.quartz实现定时任务并自定义切换任务数据源 在工作中经常会需要使用到定时任务处理各种周期性的任务,org.quartz是处理此类定时任务的一个优秀框架.随着项目一点点推进,此时我们并不满足 ...
- SpringBoot集成Quartz实现定时任务
1 需求 在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计.我的设计是按天统计每种状态的比例.为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态.另外,考 ...
随机推荐
- 阿里云服务器上安装mysql的心路历程(博友们进来看看哦)
在阿里云花了100买了一台云服务器,配置如下: CPU: 1核 内存: 512MB 数据盘: 0G 带宽: 1Mbps 阿里云服务器安装mysql搞得我想吐血,搞了一个多星期,现在才搞好,而且,还有许 ...
- java笔记之类和对象
现在编程的思想分成了两大阵营,面向过程和面向对象.现在谈谈啥是面向对象. 作为一只单身狗,谈“对象”还是很伤心很伤心的(:′⌒`)...... 先看看百度怎么说? 好吧,百度说的太抽象,我换个简单的说 ...
- JSON-JObject
http://james.newtonking.com/json/help/index.html http://www.cnblogs.com/usharei/archive/2012/04/24/2 ...
- SQL SERVER其它函数
本篇文章还是学习<程序员的SQL金典>内容的记录,此次将讲解的是SQL SERVER常用的其它函数.(其它数据库这里就不罗列了,想看更多的可以关注<程序员的SQL金典>). 具 ...
- 【BZOJ】【1076】【SCOI2008】奖励关
状压DP+数学期望 蒟蒻不会啊……看题跑…… Orz了一下Hzwer,发现自己现在真是太水了,难道不看题解就一道题也不会捉了吗? 题目数据范围不大……100*(2^16)很容易就跑过去了…… DP的时 ...
- HDU1002 -A + B Problem II(大数a+b)
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
转自 http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leetcode的人都知道, 里面有2sum, 3sum ...
- java基础知识回顾之javaIO类--RandomAccessFile类
java.io 类 RandomAccessFile java.lang.Object java.io.RandomAccessFile1.该类不是IO流中的子类.2.该类既能读又能写.3.该对象内部 ...
- [SQL Server系] -- 基本概念
以下是我总结的 SQL Server 数据库中的一些 基本概念,以便模糊时查询, 欢迎补充 1:主键: 概念: 数据表 经常有 一个列 或 列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称 ...
- 解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790 参考文章:http://blog.sina.com.cn/s/b ...