Quartz(强大的定时器)
1.关于Quartz的配置文件说明
#
# Quartz会优先读取项目下我们自定义这个quartz.properties配置文件 否则会去读取quartzjar包下org.quatrz包
# 下面的那个quartz.properties
#
#调度器属性部分
org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.instanceid:AUTO
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
#线程池属性
#线程池的实现类(一般SimpleThreadPool可以满足所有用户的需求)
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
#指定线程数 至少为1
org.quartz.threadPool.threadCount: 10
#指定线程的优先级 最大为10 最小为1
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
2.创建一个job 编写我们定时器要执行的任务
package cn.gc.helloquartz;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;
/**
* Quartz 业务逻辑层 实现Job 重写execute方法
*
* 主要三个组件 Job Scheduler trieger
* @author Superb
*
*/
public class HelloJob implements Job{
private String message;
private double math;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
Date date=new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(simpleDateFormat.format(date));
//获取该job的基本信息 name是什么 属于哪个组
JobKey key=context.getJobDetail().getKey();
key.getName();
key.getGroup();
TriggerKey triggerKey=context.getTrigger().getKey();
triggerKey.getName();
triggerKey.getGroup();
/*获取Scheduler传入JobDetail中的参数 和trigger中的参数
(1.直接从Map中获取,2.Job实现类添加对应Map中键值的属性,并加get set方法,然后使用属性自动会获取相应的值)*/
//第一种方法
//分开获取JobDetail和trigger的JobDataMap
/*还可以拿到他们共同的JobDataMap 这种情况当jobDatil和trigger中有key值相同的情况
jobDataMap只获取trigger中的参数值
JobDataMap mergerdDataMap=context.getMergedJobDataMap();*/
/*JobDataMap jobDataMap=context.getJobDetail().getJobDataMap();
String jobMessage=jobDataMap.getString("message");
System.out.println(jobMessage);
float f=jobDataMap.getFloat("math");
System.out.println(f);
JobDataMap triggerDataMap=context.getTrigger().getJobDataMap();
String triMessage=triggerDataMap.getString("message");
System.out.println(triMessage);
double d=triggerDataMap.getDouble("math");
System.out.println(d);*/
//第二种方法 建立JobDataMap中对应键值的成员属性 加上get set方法 直接拿去成员变量得值
System.out.println(message);
System.out.println(math);
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public double getMath() {
return math;
}
public void setMath(double math) {
this.math = math;
}
}
3.创建一个Scheduler执行我们的job任务
package cn.gc.helloquartz;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException {
//创建一个jobDetail实列与创建的Job绑定
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1")
//jobDetail和trigger均可以使用usingJobData方法传入参数
//在我们的Job实现类中均可以JobExecutionContext获取这些参数值
.usingJobData("message", "jobDetail")
.usingJobData("math", 8.20F)
.build();
//创建一个Trigger实列 定义该job立即执行 并每2秒执行一次
/*Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.usingJobData("message", "trigger")
.usingJobData("math", 55.0D)
//设置触发器执行的开始时间和结束时间
//.startAt(new Date()).endAt(new Date())
//表示程序一启动就立马执行
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().
//每两秒 无线重复的执行下去、
withIntervalInSeconds(2).repeatForever()).build();*/
SimpleTrigger trigger=(SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.startAt(new Date())
//.endAt(triggerEndTime)
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
//2你们秒执行一次
.withIntervalInMilliseconds(2)
//一直执行下去
//.withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)
//执行多少次
.withRepeatCount(10)).build();
//输出jobDetail的name值“myJob”
System.out.println(jobDetail.getKey().getName());
//输出jobDetail的group分组名 如果在创建jobDetail时不设置分组 则默认分在DEFAULT分组中
System.out.println(jobDetail.getKey().getGroup());
//trigger(触发器和上面jobDetail是一样可以获取name值和分组名)
System.out.println(trigger.getKey().getName());
System.out.println(trigger.getKey().getGroup());
//创建schedule实列
SchedulerFactory sFactory=new StdSchedulerFactory();
Scheduler scheduler=sFactory.getScheduler();
//启动任务
scheduler.start();
//挂起任务 当我们再次调用start()方法时就可以重新启动任务
//scheduler.standby();
//关闭任务可以传入参数bulean true等待所有的job任务执行完毕再关闭,false直接关闭 默认就是false 这个是不能再次调用start()方法的
scheduler.shutdown();
//返回一个Date 指的是最近要出发的一次执行时间
scheduler.scheduleJob(jobDetail, trigger);
}
//使用Trigger实现定时器
public void Trigger() throws SchedulerException{
//创建一个jobDetail实列与创建的Job绑定
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1")
//jobDetail和trigger均可以使用usingJobData方法传入参数
//在我们的Job实现类中均可以JobExecutionContext获取这些参数值
.usingJobData("message", "jobDetail")
.usingJobData("math", 8.20F)
.build();
//创建一个Trigger实列 定义该job立即执行 并每2秒执行一次
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.usingJobData("message", "trigger")
.usingJobData("math", 55.0D)
//设置触发器执行的开始时间和结束时间
//.startAt(new Date()).endAt(new Date())
//表示程序一启动就立马执行
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().
//每两秒 无线重复的执行下去
withIntervalInSeconds(2).repeatForever()).build();
//输出jobDetail的name值“myJob”
System.out.println(jobDetail.getKey().getName());
//输出jobDetail的group分组名 如果在创建jobDetail时不设置分组 则默认分在DEFAULT分组中
System.out.println(jobDetail.getKey().getGroup());
//trigger(触发器和上面jobDetail是一样可以获取name值和分组名)
System.out.println(trigger.getKey().getName());
System.out.println(trigger.getKey().getGroup());
//创建schedule实列
SchedulerFactory sFactory=new StdSchedulerFactory();
Scheduler scheduler=sFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
//使用SimpleTrigger进行定时任务的执行
public void SimpleTrigger() throws SchedulerException{
//创建一个jobDetail实列与创建的Job绑定
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1")
//jobDetail和trigger均可以使用usingJobData方法传入参数
//在我们的Job实现类中均可以JobExecutionContext获取这些参数值
.usingJobData("message", "jobDetail")
.usingJobData("math", 8.20F)
.build();
SimpleTrigger trigger=(SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.startAt(new Date())
//.endAt(triggerEndTime)
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
//2秒执行一次
.withIntervalInMilliseconds(2)
//一直执行下去
//.withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)
//执行多少次
.withRepeatCount(10)).build();
//输出jobDetail的name值“myJob”
System.out.println(jobDetail.getKey().getName());
//输出jobDetail的group分组名 如果在创建jobDetail时不设置分组 则默认分在DEFAULT分组中
System.out.println(jobDetail.getKey().getGroup());
//trigger(触发器和上面jobDetail是一样可以获取name值和分组名)
System.out.println(trigger.getKey().getName());
System.out.println(trigger.getKey().getGroup());
//创建schedule实列
SchedulerFactory sFactory=new StdSchedulerFactory();
Scheduler scheduler=sFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
//使用CronTrigger 来进行定时任务的调度 CornTrigger最强大 最常用
public void CronTrigger(){
//创建一个JobDetail与Job实列绑定 //不传入分组参数时 默认属于DEFAULT分组中
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build();
CronTrigger trigger=(CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("cronTrigger", "group1")
.withSchedule(
//创建Cron表达式 格式(秒 分 时 日 月 周 年)
//这个表示每秒都执行
CronScheduleBuilder.cronSchedule("* * * * ? * *")
).build();
}
}
Quartz(强大的定时器)的更多相关文章
- Spring整合Quartz实现动态定时器
一.版本说明 spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错. 原因:spring对于quartz的支持实现,org.springf ...
- spring quartz整合实现定时器自动注解
1.web.xml中添加侦听器 <listener> <listener-class>org.springframework.web.context.ContextLoa ...
- Spring整合Quartz实现动态定时器,相关api,定时器添加,删除,修改
一.版本说明 spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错. 原因:spring对于quartz的支持实现,org.springf ...
- java定时器,Spring定时器和Quartz定时器
一.java定时器的应用 其实java很早就有解决定时器任务的方法了,java提供了了类java.util.TimerTask类基于线程的方式来实现定时任务的操作,然后再提供java.util.Tim ...
- 补习系列(9)-springboot 定时器,你用对了吗
目录 简介 一.应用启动任务 二.JDK 自带调度线程池 三.@Scheduled 定制 @Scheduled 线程池 四.@Async 定制 @Async 线程池 小结 简介 大多数的应用程序都离不 ...
- spring定时器(二)
此定时器可重置定时时间. 1. spring的定时器配置文件application.xml: <?xml version="1.0" encoding="UTF-8 ...
- 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】
一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的序列化机制,可以序列到 sqlserver,mysql,当然还可以在 ...
- spring quartz开发中使用demo
1.首先在pom.xml中配置quartz的jar: <!--定时器--> <dependency> <groupId>org.quartz-scheduler&l ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(84)-Quartz 作业调度用法详解一
前言 我从Quartz2.0开始使用,并对其进行了封装了界面,可以参考 http://www.cnblogs.com/ymnets/p/5065154.html 最近拿出来进行了优化,并升级到最新版, ...
随机推荐
- vue 定时器的问题
在项目中,我们经常会使用到定时器setInterval(),可是很多时候我们会发现,即使我退出当前页面,定时器依然在工作,非常消耗内存,所以我们要进行手动清理: 将定时器保存在变量中,退出页面时清除变 ...
- 江西财经大学第一届程序设计竞赛 H题 求大数的阶乘
链接:https://www.nowcoder.com/acm/contest/115/H 来源:牛客网 晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活. 他总是能从所学的知识 ...
- pep8 && pep20
pep8(部分,遇到问题再补充) 1.不建议使用tab键来空格,避免不必要的空格.操作符左右各加一个空格,函数默认参数使用的赋值符左右省略空格. 2.类和top-level函数定义之间空两行:类中的方 ...
- .linearDrag on rigidbody / rigidbody2D in code?
it's rigidbody.drag not .linearDrag 这几天在做一个弹球的游戏,发现小球落下后不会自动停,测试后发现线性阻尼增加后可以 于是加了个触发器不停增加线性阻尼值 priva ...
- vue 点击图片显示大图
使用指南:https://www.npmjs.com/package/vue-directive-image-previewer 简单使用: 1.安装vue-directive-image-previ ...
- mysql学习2:模糊匹配查询like,regexp,in
mysql模糊匹配查询like,regexp,in 摘要 内容比较简单,无摘要. 关键词 模糊查询 like regexp in contact 正文 下图是示例用到的数据表信息 ...
- 使用PHP来简单的创建一个RPC服务
RPC全称为Remote Procedure Call,翻译过来为"远程过程调用".主要应用于不同的系统之间的远程通信和相互调用. 比如有两个系统,一个是PHP写的,一个是JAVA ...
- JFinal文件上传时直接使用getPara()去接受表单的数据接收到的数据一直是null?
解决方案: 在文件上传页面form 标签中使用: enctype="multipart/form-data" 在controller类中先调用getFile系列方法才能使getPa ...
- C#执行javascript代码,执行复杂的javascript代码新方式
1. 使用nuget 包"Jurassic", 注意,如果 nuget上的包 用起来出现错误,请自行下载 github代码,自行编译最新代码成dll,再引用. 官方的nuget包 ...
- react-router4 第一篇
无奈,英语4级没过,只能靠猜了.. 首先就是安装了 npm install --save-dev react npm install --save-dev react-dom npm install ...