项目开发中经常需要定时循环执行某些任务

比如定时发送报表,定时发送邮件,亦或者定时清理缓存,定时更新数据等等

有些时候可以简单地利用Windows Server的计划任务执行程序

Linux也有相应的计划任务配置

但如果碰到比较复杂的循环定时

比如周一到周五的8点到18点,每隔1小时发送报表邮件

或者每个月的最后一个周六的晚上24:00对数据库进行备份等等

这时候我们需要一个稳定、灵活、轻量级的JAVA作业调度框架

Quartz呼之欲出

官网地址:http://www.quartz-scheduler.org/downloads

这个地址可能被墙,最新版本是2.2版

使用Quartz框架可以很方便实现复杂时间节点的作业调度

它的cron表达式相当好用,简单几个字符就可以制定您能想象出的任何时间规则

下面是博主使用简单代码,实现使用Quartz框架的作业调度

  1. package com.newflypig.quartz;
  2.  
  3. import static org.quartz.JobBuilder.*;
  4. import static org.quartz.TriggerBuilder.*;
  5. import static org.quartz.CronScheduleBuilder.*;
  6.  
  7. import java.text.SimpleDateFormat;
  8. import java.util.Date;
  9. import java.util.Properties;
  10.  
  11. import org.quartz.JobDetail;
  12. import org.quartz.Scheduler;
  13. import org.quartz.Trigger;
  14. import org.quartz.impl.StdSchedulerFactory;
  15.  
  16. /**
  17. * 使用Quartz创建定时任务,while循环一直执行下去
  18. * @author newflypig
  19. * time:2015年10月27日
  20. * TODO
  21. *
  22. */
  23.  
  24. public class QuartzDemo {
  25.  
  26. public static void main(String[] args) throws Exception{
  27. //读取properties配置文件
  28. Properties prop=new Properties();
  29. prop.load(QuartzDemo.class.getResourceAsStream("/set.properties"));
  30. String toAccountId=prop.getProperty("toAccountId","fd60e46db0dc119cfea740c3375fd7c4");
  31. String cron=prop.getProperty("cron","0/10 * 8-18 * * ?");
  32. //创建Quartz的计划任务
  33. Scheduler sched = new StdSchedulerFactory().getScheduler();

  34.      //配置计划任务的工作类名,这个类需要实现Job接口,在execute方法中实现所需要做的工作
  35. JobDetail job = newJob(ExportExcelAndPostInYixin.class).build();
    //向工作类传递参数
  36. job.getJobDataMap().put("toAccountId",toAccountId);

  37. //配置计划任务的定时器
  38. Trigger trigger = newTrigger().withSchedule(cronSchedule(cron)).build();
  39.  
  40. Date date=sched.scheduleJob(job, trigger);//获得首次将要执行计划任务的时间,待会儿println出来
  41. sched.start();//开始执行
  42.  
  43. System.out.println("first time run at:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));

  44. //无限循环下去
  45. boolean flag=true;
  46. while(flag){
  47. Thread.sleep(24*3600*1000);
  48. }
  49. sched.shutdown();
  50. }
  51. }

下面给一个博主自己定时发送Excel报表到易信客户单的Job示例

  1. package com.newflypig.quartz;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5.  
  6. import com.newflypig.excel.OpenExcelDemo;
  7. import com.newflypig.jpg.DrawFromExcel;
  8. import com.newflypig.post.SendPostToYixin;
  9.  
  10. import org.quartz.Job;
  11. import org.quartz.JobExecutionContext;
  12. import org.quartz.JobExecutionException;
  13.  
  14. /**
  15. * 导出Excel到PNG,并调用易信接口发送POST请求,推送PNG图片到指定好友
  16. * @author newflypig
  17. * time:2015年10月27日
  18. * TODO
  19. *
  20. */
  21. public class ExportExcelAndPostInYixin implements Job {
  22.  
  23. @Override
  24. public void execute(JobExecutionContext arg) throws JobExecutionException {
  25. String[] time=getTimeStr();
  26. String toAccountId=arg.getJobDetail().getJobDataMap().getString("toAccountId");
  27. String access_token=arg.getJobDetail().getJobDataMap().getString("access_token");//修改Excel模板
  28. try {
  29. new OpenExcelDemo().doOpenExcel(...);
  30. } catch (Exception e1) {
  31. e1.printStackTrace();
  32. }
  33.  
  34. //将Excel绘制成PNG
  35. String exportPNGPath=dirPath + time[1] + ".png";
  36. DrawFromExcel dfe=new DrawFromExcel();
  37. dfe.setExportPNGPath(exportPNGPath);
  38. dfe.setFileName(fileName);
  39. dfe.setSheetName(sheetName);
  40. dfe.setFromIndex(fromIndex);
  41. dfe.setToIndex(toIndex);
  42. try {
  43. dfe.draw();
  44. } catch (Exception e1) {
  45. e1.printStackTrace();
  46. }
  47.  
  48. String pngFileName=time[1];
  49. try {
  50. SendPostToYixin.doPost(toAccountId,access_token,pngFileName,urlPath);
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }
  55.  
  56. public String[] getTimeStr() {
  57. String[] time = new String[2];
  58. Date date=new Date();
  59. time[0]=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
  60. time[1]=new SimpleDateFormat("yyyyMMddHHmmss").format(date);
  61. return time;
  62. }
  63. }

至此就完成整个作业调度的结构

首先主程序中创建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创建定时任务的更多相关文章

  1. JAVAEE——BOS物流项目13:Quartz概述、创建定时任务、使用JavaMail发送邮件、HighCharts概述、实现区域分区分布图

    1 学习计划 1.Quartz概述 n Quartz介绍和下载 n 入门案例 n Quartz执行流程 n cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用Jav ...

  2. .net core+topshelf+quartz创建windows定时任务服务

    .net core+topshelf+quartz创建windows定时任务服务 准备工作 创建.net core 控制台应用程序,这里不做过多介绍 添加TopShelf包:TopShelf: 添加Q ...

  3. Quartz.net 定时任务之Cron表达式

    一.cron表达式简单介绍和下载 1.在上一篇博客"Quartz.net 定时任务之简单任务"中,我简单介绍了quartz的使用,而这篇博客我将介绍cron的具体使用(不足之处望大 ...

  4. Spring Boot整合Quartz实现定时任务表配置

    最近有个小项目要做,spring mvc下的task设置一直不太灵活,因此在Spring Boot上想做到灵活的管理定时任务.需求就是,当项目启动的时候,如果有定时任务则加载进来,生成schedule ...

  5. springboot整合Quartz实现定时任务

    1.maven依赖: <!--quartz--> <dependency> <groupId>org.quartz-scheduler</groupId> ...

  6. Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...

  7. SpringBoot创建定时任务

    之前总结过spring+quartz实现定时任务的整合http://www.cnblogs.com/gdpuzxs/p/6663725.html,而springboot创建定时任务则是相当简单. (1 ...

  8. Spring Boot集成quartz实现定时任务并支持切换任务数据源

    org.quartz实现定时任务并自定义切换任务数据源 在工作中经常会需要使用到定时任务处理各种周期性的任务,org.quartz是处理此类定时任务的一个优秀框架.随着项目一点点推进,此时我们并不满足 ...

  9. SpringBoot集成Quartz实现定时任务

    1 需求 在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计.我的设计是按天统计每种状态的比例.为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态.另外,考 ...

随机推荐

  1. Visual Studio Code asp.net 5环境搭建技能Get

    启动准备阶段 预热 1 VS Code 官方地址:https://www.visualstudio.com/en-us/products/code-vs.aspx 2 安装Node.js :https ...

  2. IIS Express start introduction and applicationHost modification

    1. First you need create a web project in VS 2. When you finish your project, click start then IIS E ...

  3. 翻译:用Javascript的Function构造器伪造上下文 by Ben Nadel

    在我的jQuery模板标记语言(JTML)项目中,我需要一种方式将JTML模板编译到JS函数,这样它们就可以如期地在任何时候转换成新的HTML标记.但这是一个严峻的问题,因为JTML代码涉及非作用域( ...

  4. 利用vim阅读源代码一个好用的工具

    阅读源代码时常常遇到找变量,函数定义的问题.vim为我们提供了一个好用的工具,ctags. 安装 ctags. 在 libvirt的源代码根目录运行 ctags -R . vim -t virConn ...

  5. 仪表盘 hostmap 新玩法让运维工作越玩越 high

    Cloud Insight 第13次新品发布会现在开始,首先非常感谢大家前来看我们的新功能发布会,下面我先给大家介绍一下新功能,之后有什么问题大家尽管问

  6. Java Memory Basic

    转自: http://www.blogjava.net/justinchen/archive/2009/justinchen/archive/2009/01/08/248738.html GC and ...

  7. hdu 1879 继续畅通工程(最小生成树,基础)

    题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<algo ...

  8. POJ 3104

    Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7959   Accepted: 2014 Descriptio ...

  9. POJ2299Ultra-QuickSort

    http://poj.org/problem?id=2299 题意 : 排序,求排序次数,本来以为用冒泡可以搞定,事实上,那么大的数据以及一个TLE告诉我,会超时......... 思路 : 问了一下 ...

  10. Android ImageButton的背景(图片)大小

    使用ImageButton的background属性,而不用src属性. 然后使用width和height进行调整.