quartz的学习和简单使用
以前在框架中使用过,很多都是纯粹的复制粘贴,了解过用法知道如何配置,但时间久了就没什么印象了,现在重新捡起来,再次进行学习。
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的学习和简单使用的更多相关文章
- Quartz.NET学习笔记(三) 简单触发器
触发器是Quartz.NET的另外第一个核心元素,他有2种类型,简单触发器(Simple Trigger)和计划任务触发器(Cron Trigger), 一个触发器可以绑定一个任务. 通用触发器属性 ...
- Quartz定时任务学习(二)web应用/Quartz定时任务学习(三)属性文件和jar
web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...
- Quartz定时任务学习(二)web应用
web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...
- Quartz.NET学习系列
Quartz.NET它是一个开源的任务调度引擎,对于周期性任务,持久性任务提供了很好的支持,并且支持持久性.集群等功能. 这是什么对我来说Quartz.NET学习记录: 源代码下载http://yun ...
- Quartz框架学习(1)—核心层次结构
Quartz框架学习 Quartz(任务调度)框架的核心组件: job:任务.即任务调度行为中所要调度的对象. trigger:触发器.是什么促使了一个任务的调度?当然是时间.这也算事件驱动类型程序. ...
- JMeter学习工具简单介绍
JMeter学习工具简单介绍 一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态 ...
- Quartz.Net学习笔记(2)-简介
一.Quartz.Net是什么 1.来源 Quartz.Net是一个开源的作业调度框架: 2.下载地址 官网地址:http://www.quartz-scheduler.net/documentati ...
- (java)selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出
selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出: 该情况适合能能循环page=1~n,并且每个网页随着循环可以打开的情况, 注意一定是自己拼接的url可以 ...
- IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试
IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...
随机推荐
- JMS学习二(简单的ActiveMQ实例)
下载安装ActiveMQ服务,下载地址当然可以去官网下载 http://activemq.apache.org/download-archives.html ActiveMQ安装很简单,下载解压后到b ...
- Java数据结构之排序---希尔排序
希尔排序的基本介绍: 希尔排序同之前的插入排序一样,它也是一种插入排序,只不过它是简单插入排序之后的一个优化的排序算法,希尔排序也被称为缩小增量排序. 希尔排序的基本思想: 希尔排序是把数组中给定的元 ...
- mysql 时间差
SELECT TIMESTAMPDIFF(minute,'2019-01-01 00:00:00', '2019-01-01 01:30:00') 返回结果 90 类推,有 SELECT TIMEST ...
- 每日踩坑 2019-08-23 button 元素点击后刷新页面
button标签按钮会提交表单. 解决方案: <button class="btn btn-primary" type="button" id=" ...
- jprofiler监控wls&was配置
jprofiler简介: jprofiler的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图.所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象. ...
- win10 配置tensorflow环境
1. 在anaconda中新增环境 python3.5, 我使用的是anaconda-navigator 中新增的环境,python版本选择3.5 2. 激活新增加的环境, 注意win下,没有sour ...
- 2014过去了,正式步入职场了,.net
一.第一家公司(北京XXXXXXX) 从2014年7月1号拿到学位证,到7月15号到北京,努力找工作,用了两个多礼拜,终于找到了一个只有三个人的公司,愿意要我,薪资是实习三千,转正四千. 2014年7 ...
- 四、IDEA创建SpringBoot项目
1.从官网下载之后直接导入IDEA: 下载完成解压之后如下图: IDEA导入该项目: 之后一路next即可 导入成功之后你可能会发现左下角一直有个进度条在进行,傻傻的同学可能以为是在下载jar包,下个 ...
- Linux_LVM、RAID_RHEL7
目录 目录 LVM逻辑卷管理 把物理分区初始化为物理卷 创建卷组 建立逻辑卷 格式化 挂载 vg拓展操作 lv扩展操作 RAID RAID 类型 RAID0条带化 RAID1镜像 RAID5条带冗余 ...
- TCP 首部格式
<图解TCP/IP> 6.7 TCP的首部格式 TCP中没有表示包长度和数据长度的字段.可由IP层获知TCP的包长由TCP的包长可知数据的长度. 源端口号:表示发送端端口号,字段长16位 ...