最近在工作中,要做定时任务的更能,最开始的时候,想到的是 JavaSE 中,自带 Timer 及 TimerTask 联合使用,完成定时任务。最后发现,随着业务的复杂,JDK 中的 Timer 和 TimerTask 并不能简单、灵活的完成定时任务的操作。于是,便学习了任务调度框架-- Quartz。在最初的学习中,网上的例子大多数是基于 quartz-2.0.0 之前的版本,但是发现,2.0.0之前的版本和 2.0.0之后的变化还是比较大的,网上给出的例子及方法,都不适用了。最后,在学习了 quartz-2.1.7 之后,大致了解了下相关的方法。现分享出来,以供学习。

  这次大概会写到的东西,如下图:

  第一个简单的任务调度实例如下:

首先是自定义自己的作业类,然后是开始任务调度操作。具体的使用方法,如下代码:

(1)自定义的作业类

/** 0.0.0.1 */

package com.gaoqing.common.quartz;

import java.text.SimpleDateFormat;
import java.util.Date; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; /**
* 自定义作业类
* @author 高青
* 2014-3-23
*/
public class MyJob implements Job{ /**
* 2014-3-23
*/
public MyJob() { } @Override
public void execute(JobExecutionContext context) throws JobExecutionException { //得到当前作业的名称
String jobName = context.getJobDetail().getJobDataMap().getString("name"); System.out.println(
"当前作业开始执行了,作业的名称为:" + jobName +
",作业的时间是:" + new SimpleDateFormat("yyyy-MM-dd").format(new Date())
);
} }

作业类中的逻辑就是,取出任务调度器中注册的 JobDetail 的名称。

(2)具体的任务调度操作如下:

/** 0.0.0.1 */

package com.gaoqing.common.quartz;

import java.util.Date;

import org.apache.log4j.Logger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory; /**
* 简单任务调度测试类
* @author 高青
* 2014-3-20
*/
public class SimpleQuartzTest{ /** 日志对象 */
private static Logger log = Logger.getLogger(SimpleQuartzTest.class); /**
* 2014-3-20
*/
public SimpleQuartzTest() { } /**
* 主线程方法
* author 高青
* 2014-3-20
* @param args 参数字符串集
* @return void 空
* @throws SchedulerException 调度器异常
*/
public static void main(String[] args) throws SchedulerException { //得到一个默认的调度器
Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler(); //得到具体的和指定作业相关的 JobDetail 对象
JobDetail jobDetail = JobBuilder.              //2.0.0之后,JobDetail 变成了接口,不能用之前的 new JobDetail()来实例了,现在要通过相应的作业建造器来管理生成
newJob(MyJob.class).
withIdentity("myFirstJob", "firstJob").
build();              //要调用建造器的 build()方法,才能实例当前作业的具体作业对象 //得到作业的参数对象
JobDataMap jobDataMap = jobDetail.getJobDataMap();   //可以向作业数据对象中,存放自己需要的数据,在自己实现的 Job 类中,可以通过 context 得到相应的参数,以便做业务处理
jobDataMap.put("myFirstJob", "first");
jobDataMap.put("name", "myFirstJob"); //实例化触发器对象(定义执行的时间和执行的周期)
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger(). //同上,触发器的也需要相应的建造器来实例化触发器,现在的 Trigger 也是接口,不能通过 new Trigger() 来实例化了
withIdentity(TriggerKey.triggerKey("myFirstTigger", "myFirstGroup")).
withSchedule(                       //在得到对应的 SimpleTrigger 时,需要通过触发器建造器的 widthSchedule()方法,建造对应的触发器
SimpleScheduleBuilder.
simpleSchedule().
repeatForever().
withIntervalInSeconds(5)
).
startAt(new Date()).
build(); //添加调度作业(将具体的作业和触发器添加到作业中)
defaultScheduler.scheduleJob(jobDetail, simpleTrigger); //执行调度任务
defaultScheduler.start();
}
}

  上面就是一个简单的任务调度的实现,和之前的版本相比,变化还是挺大了,个人感觉后面的版本更强调了性能和多任务处理。本文主要旨在实用,并不讲解大量的理论,理论在网上都是可以搜到的。希望自己的一点点分享,能对他人有一点点的帮助。下一篇,将写一个简单的任务调度实例,使用更能强大的 CronTrigger 触发器来实现任务调度功能。

  

Quartz_1_简单编程式任务调度使用(SimpleTrigger)的更多相关文章

  1. Quartz_2_简单编程式任务调度使用(CronTrigger)

    第二个要介绍的任务调度器中的触发器是 CronTrigger ,相比较 SimpleTrigger 来说,CronTrigger 相对灵活,对于复杂的业务需求来说,更加的实用.要在使用 CronTri ...

  2. Spring事务管理的另一种方式--TransactionTemplate编程式事务管理简单入门

    1, 一直以来, 在用Spring进行事物管理时, 只知道用声明式的策略, 即根据不同的数据源, 配置一个事物管理器(TransactionManager), 通过配置切面(PointCut)应用到相 ...

  3. Spring4.0编程式定时任务配置

    看过很多定时调度的配置,大多使用XML配置,觉得比较麻烦,也比较老套.这里介绍一种基于spring4.0注解编程式配置定时任务,简单清晰,使用方便.. 至于引入spring相关jar这里不多说,直接切 ...

  4. 全面分析 Spring 的编程式事务管理及声明式事务管理

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  5. Spring学习8-Spring事务管理(编程式事务管理)

    一.Spring事务的相关知识   1.事务是指一系列独立的操作,但在概念上具有原子性. 比如转账:A账号-100, B账号+100,完成.这两个操作独立是没问题的. 但在逻辑上,要么全部完成,要么一 ...

  6. 全面分析 Spring 的编程式事务管理及声明式事务管理--转

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  7. Spring事务管理的实现方式:编程式事务与声明式事务

    1.上篇文章讲解了Spring事务的传播级别与隔离级别,以及分布式事务的简单配置,点击回看上篇文章 2.编程式事务:编码方式实现事务管理(代码演示为JDBC事务管理) Spring实现编程式事务,依赖 ...

  8. Spring事务管理的实现方式之编程式事务与声明式事务详解

    原创说明:本博文为原创作品,绝非他处转载,转载请联系博主 1.上篇文章讲解了Spring事务的传播级别与隔离级别,以及分布式事务的简单配置,点击回看上篇文章 2.编程式事务:编码方式实现事务管理(代码 ...

  9. 春天的事务之9.3编程式事务 - 跟我学spring3

    9.3编程式事务 9.3.1编程式事务概述 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理. Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是采用相同 ...

随机推荐

  1. C++的坑真的多吗

    先说明一下,我不希望本文变成语言争论贴.希望下面的文章能让我们客观理性地了解C++这个语言.(另,我觉得技术争论不要停留在非黑即白的二元价值观上,这样争论无非就是比谁的嗓门大,比哪一方的观点强,毫无价 ...

  2. vue项目中如何将工具函数模块化导出

    如下所示,utils文件夹下的js里都是封装好的工具函数, 如formatDate.js内容如下: export default (day)=>{ var tmpDate = day ? new ...

  3. vs 2005/2008/2010 ATL ActiveX控件显示XP风格

    vs 2005/2008/2010 ATL ActiveX控件在IE浏览器中控件显示的是原始的风格,要显示XP风格只要进行以下操作 一.在Stdafx.h中增加下以内容 #if defined _M_ ...

  4. 201621123014《Java程序设计》第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 答: 注1:关键词与内容不求多,但概念之间的联系 ...

  5. python在字符串中查找字符

    两类函数: find(),rfind() index(),rindex() 找到了都返回下标. find找不到返回-1,index找不到抛出ValueError. 带r的表示从右向左找. 都可以使用第 ...

  6. php是如何工作的

    a:前提条件: apache服务器启动正常工作 b:客户端浏览器在地址栏输入一个程序地栏 按回车发送请求 {请求}http://127.0.0.1/day03/1.php c:apache接收请求,并 ...

  7. 关于stl advance函数移动步数超过容器大小(越界)的研究

    今天使用advance遇到个问题,当advance移动步数超过容器大小时,表现的结果居然不一样. 再来看下stl源码 template<typename _BidirectionalIterat ...

  8. svn代码回滚命令 svn up -r

    第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [-R] something 其中so ...

  9. OpenCV-Python在图片上输出中文

    OpenCV中在图片上输出中文一般需要借助FreeType库实现.FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件.但使用FreeType ...

  10. git常用命令收藏

    git init //初始化本地git环境 git clone XXX//克隆一份代码到本地仓库 git pull //把远程库的代码更新到工作台 git pull --rebase origin m ...