以前在框架中使用过,很多都是纯粹的复制粘贴,了解过用法知道如何配置,但时间久了就没什么印象了,现在重新捡起来,再次进行学习。

quartz相关的介绍都已经很多了,我就不重复啰嗦,简单说一下个人的认识和使用。

* 定时任务 quartz的设计比较合理,将调度Scheduler、触发Trigger、任务进行分离Job(这里使用JobDetail创建Job的实例)
* 调度Scheduler负责任务的调度执行以及任务的销毁
* 触发器设定Trigger事件的触发条件或时间,分为SimpleTrigger和CronTrigger两种常用模式,
* 当然还有其他两种模式CalendarIntervalTrigger 按日期触发的Trigger 和 DailyTimeIntervalTrigger 按天触发的Trigger
* 其中CronTrigger中的设置规范基本等同于cron4j,不过增加了秒
* JobDetail是任务的定义,而Job是任务的执行逻辑

在学习cron4j的时候,我使用了的内部类,在创建quartz的时候我也同样使用了内部类,但示例始终不能启动,找了很长时间,没想到这里还有个坑,现在也不知道因为什么。

下面代码是个反面教材,是不能运行的,需要将HelloTask类单独出来写才可以运行。

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import static org.quartz.DateBuilder.evenMinuteDate ; /**
*
* @author Uboobo
*
* 定时任务 quartz的设计比较合理,将调度Scheduler、触发Trigger、任务进行分离Job(这里使用JobDetail创建Job的实例)
* 调度Scheduler负责任务的调度执行以及任务的销毁
* 触发器设定Trigger事件的触发条件或时间,分为SimpleTrigger和CronTrigger两种常用模式,
* 当然还有其他两种模式CalendarIntervalTrigger 按日期触发的Trigger 和 DailyTimeIntervalTrigger 按天触发的Trigger
* 其中CronTrigger中的设置规范基本等同于cron4j,增加了秒
* JobDetail是任务的定义,而Job是任务的执行逻辑
*
*/ public class QuartzTask
{
// 创建scheduler
public static void createScheduler(JobDetail job, Trigger trigger)
{
try
{
// 创建scheduler,需要捕获调度异常
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 加入这个调度
scheduler.scheduleJob(job, trigger); // 启动之
scheduler.start(); // 运行一段时间后关闭
Thread.sleep(10000); scheduler.shutdown(true); } catch (SchedulerException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
} // 创建Trigger
public static Trigger createTrigger()
{
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(10)//间隔时间是10s
.repeatForever())
.build(); return trigger;
} // 创建Job
public static JobDetail createJob()
{
JobDetail job = newJob(HelloTask.class)
.withIdentity("myJob", "group1")
.build();
return job;
} // 内部类 ,坑在这这里,需要使用单独的类
static class HelloTask implements Job
{ @Override
public void execute(JobExecutionContext context) throws JobExecutionException
{
JobDetail detail = context.getJobDetail();
// TODO Auto-generated method stub
String name = detail.getJobDataMap().getString("name"); System.out.println(" my job do..." + name);
} }
public static void main(String[] args) throws Exception { JobDetail job = createJob();
Trigger trigger = createTrigger();
createScheduler(job,trigger); }

代码里没有标注太多注释,这里多说几句,一个quartz任务要执行的话,首先要通过StdSchedulerFactory.getDefaultScheduler() 创建scheduler,只有这样才能使用调度,然后要通过Trigger去创建一个或多个触发器并设定执行时间,然后再去使用JobDetail创建job,再使用job去加载我们要去执行的类,最后使用调度去加载执行。

quartz的设计将其进行分层还是有很多好处,但也增加了一些复杂度,如果直接使用scheduler去调用job也是可以的,但如果实现多重负责设置就比较困难了。

下面贴一下可以运行的代码

    public static void main(String [] args)
{
try
{
// 创建scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 定义一个Trigger
Trigger trigger = newTrigger().withIdentity("trigger1", "group1") // 定义name/group
.startNow()// 一旦加入scheduler,立即生效
.withSchedule(simpleSchedule() // 使用SimpleTrigger
.withIntervalInSeconds(1) // 每隔一秒执行一次
.repeatForever()) // 一直执行,奔腾到老不停歇
.build(); // 定义一个JobDetail
JobDetail job = newJob(HelloJob.class) // 定义Job类为HelloQuartz类,这是真正的执行逻辑所在
.withIdentity("job1", "group1") // 定义name/group
.usingJobData("name", "quartz") // 定义属性
.build(); // 加入这个调度
scheduler.scheduleJob(job, trigger); // 启动之
scheduler.start(); // 运行一段时间后关闭
Thread.sleep(100000);
scheduler.shutdown(true); } catch (Exception e)
{
e.printStackTrace();
}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; /**
* hello world Quartz
* @author weeks
*
*/
public class HelloJob implements Job
{ private static Logger _log = LoggerFactory.getLogger(HelloJob.class); /**
* Job,Job需要一个公有的构造函数,否则Factory无法构建
*/
public HelloJob()
{
} /**
* 实现execute方法
*/
public void execute(JobExecutionContext context) throws JobExecutionException
{
System.out.println(" my job do...");
}
}

这里还遗留一个问题,import中使用了 static 有点不太明白,设计者为什么要这么做,这么做有什么好处,待我了解之后再来补充。

quartz的学习和简单使用的更多相关文章

  1. Quartz.NET学习笔记(三) 简单触发器

    触发器是Quartz.NET的另外第一个核心元素,他有2种类型,简单触发器(Simple Trigger)和计划任务触发器(Cron  Trigger), 一个触发器可以绑定一个任务. 通用触发器属性 ...

  2. Quartz定时任务学习(二)web应用/Quartz定时任务学习(三)属性文件和jar

    web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...

  3. Quartz定时任务学习(二)web应用

    web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...

  4. Quartz.NET学习系列

    Quartz.NET它是一个开源的任务调度引擎,对于周期性任务,持久性任务提供了很好的支持,并且支持持久性.集群等功能. 这是什么对我来说Quartz.NET学习记录: 源代码下载http://yun ...

  5. Quartz框架学习(1)—核心层次结构

    Quartz框架学习 Quartz(任务调度)框架的核心组件: job:任务.即任务调度行为中所要调度的对象. trigger:触发器.是什么促使了一个任务的调度?当然是时间.这也算事件驱动类型程序. ...

  6. JMeter学习工具简单介绍

    JMeter学习工具简单介绍   一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态 ...

  7. Quartz.Net学习笔记(2)-简介

    一.Quartz.Net是什么 1.来源 Quartz.Net是一个开源的作业调度框架: 2.下载地址 官网地址:http://www.quartz-scheduler.net/documentati ...

  8. (java)selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出

    selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出: 该情况适合能能循环page=1~n,并且每个网页随着循环可以打开的情况, 注意一定是自己拼接的url可以 ...

  9. IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试

    IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...

随机推荐

  1. Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)

    上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...

  2. Mongodb分片副本集集群搭建

    一.环境准备 1.1.主机信息(机器配置要求见硬件及开发标准规范文档V1.0) 序号 主机名 IP 1 DB_01 10.202.105.52 2 DB_02 10.202.105.53 3 DB_0 ...

  3. AAAI 2018 分析

    AAAI 2018 分析 word embedding Learning Sentiment-Specific Word Embedding via Global Sentiment Represen ...

  4. 3、maven导入外部自定义jar包

    有些时候我们自己有一些jar包需要导入到我们的仓库中,然后在maven项目里的pom.xml文件加入这些jar包的依赖即可使用这些jar包了 1.确保行执行mvn -v没有问题 2.把需要引入的jar ...

  5. centOS7杀死进程命令

    查看当前所有正在运行的进程,可以看到80端口被httpd占用了(80端口希望分配给nginx使用,而不是httpd) netstat -tpnul 这里以杀死httpd进程为例: 先查看 httpd ...

  6. JavaScript对象的常用属性及使用

    什么是浏览器对象模型? 浏览器对象模型(BOM Browser Object Model)是JavaScript的组成之一,它提供了独立于内容和浏览器窗口进行交互的对象,使用浏览器对象模型可以实现与H ...

  7. 阶段3 1.Mybatis_08.动态SQL_01.mybatis中的动态sql语句-if标签

    创建新的工程 复制到新建的项目里面 pom.xml依赖部分复制过来 dao中整理代码 只保留四个查询 映射文件也只保留四个查询方法 增加一个根据条件查询的方法. 由于用了别名,所以parpameter ...

  8. Delphi DbgridEh实现鼠标拖动选中列,并使复选框选中

    1.先设置表格列的属性 procedure TForm_TaskToDW.InitGrid;var  MyCol: TColumnEh;begin  with DBGridEh_Task do  be ...

  9. 【Qt开发】事件循环与线程 一

    事件循环与线程 一 初次读到这篇文章,译者感觉如沐春风,深刻体会到原文作者是花了很大功夫来写这篇文章的,文章深入浅出,相信仔细读完原文或下面译文的读者一定会有收获. 由于原文很长,原文作者的行文思路是 ...

  10. iptables添加开放端口

    查看状态 iptables -L -n 编辑/etc/sysconfig/iptables -A INPUT -p tcp -m tcp --dport 4000 -j ACCEPT 重启 servi ...