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(强大的定时器)的更多相关文章

  1. Spring整合Quartz实现动态定时器

    一.版本说明 spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错. 原因:spring对于quartz的支持实现,org.springf ...

  2. spring quartz整合实现定时器自动注解

    1.web.xml中添加侦听器 <listener>    <listener-class>org.springframework.web.context.ContextLoa ...

  3. Spring整合Quartz实现动态定时器,相关api,定时器添加,删除,修改

    一.版本说明 spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错. 原因:spring对于quartz的支持实现,org.springf ...

  4. java定时器,Spring定时器和Quartz定时器

    一.java定时器的应用 其实java很早就有解决定时器任务的方法了,java提供了了类java.util.TimerTask类基于线程的方式来实现定时任务的操作,然后再提供java.util.Tim ...

  5. 补习系列(9)-springboot 定时器,你用对了吗

    目录 简介 一.应用启动任务 二.JDK 自带调度线程池 三.@Scheduled 定制 @Scheduled 线程池 四.@Async 定制 @Async 线程池 小结 简介 大多数的应用程序都离不 ...

  6. spring定时器(二)

    此定时器可重置定时时间. 1. spring的定时器配置文件application.xml: <?xml version="1.0" encoding="UTF-8 ...

  7. 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】

    一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的序列化机制,可以序列到 sqlserver,mysql,当然还可以在 ...

  8. spring quartz开发中使用demo

    1.首先在pom.xml中配置quartz的jar: <!--定时器--> <dependency> <groupId>org.quartz-scheduler&l ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(84)-Quartz 作业调度用法详解一

    前言 我从Quartz2.0开始使用,并对其进行了封装了界面,可以参考 http://www.cnblogs.com/ymnets/p/5065154.html 最近拿出来进行了优化,并升级到最新版, ...

随机推荐

  1. 安卓操作系统版本(Version)与应用程序编程接口等级(Application Programming Interface Level)对照表

    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑. 使用Android API,可以在Java环境开发App,编译.打包后可在Android系统 ...

  2. JavaScript各种继承方式(一):原型链继承(prototype chaining)

    一 原理 子类的构造函数的原型对象,是父类的构造函数创建的实例. function Fruit(){ this.name = '水果'; this.nutrition=['维生素','膳食纤维']; ...

  3. JQuery|jstl判断是否为空

    //有如下三种判断 var A=$("#**).val(); if(A==null||A==undefined||A==""){ //处理 } //参考文章1说下面方法效 ...

  4. 微信公众号开发(5)---使用开源组件开发公众号OAuth2.0网页授权授权登录

    搞清微信公众号授权登录的步骤步骤,我们的开发就完成了一大步 献上github 地址: https://github.com/Wechat-Group/weixin-java-tools/wiki/MP ...

  5. ret和retf

    ret指令用栈中的数据,修改IP的内容,从而实现近转移; retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移. CPU执行ret指令时,进行下面两步操作: (IP) = ((ss)*16+ ...

  6. overflow visibility opacity(透明度) vertical-align 等等

     一,overflow属性:   1,四个值:    visible     默认值.内容不会被修剪,会呈现在元素框之外.    hidden        内容会被修剪,并且其余内容是不可见的.   ...

  7. hibernate懒加载

    Hibernate懒加载解析 hibernatejoinsession数据库sqlobject Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适 ...

  8. c# usercontrol ,networkcomms3.0 Invoke总结

    1: accordionControl 添加了自定义控件页面 之后,切换到别的页面后,原先打开的页面对象还是存在的没有被销毁,再打开时重新引用即可 private void accordionCont ...

  9. socket网络编程扫盲篇

    socket 是“套接字”的意思,是计算机之间进行通信的一种约定,也可以认为是一种技术.通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据. socket 的 ...

  10. Python while for if....else

    1函数input()的工作原理: 函数input()让程序暂停运行,等待用户输入一些文本.获取用户输入后,python将其存储在一个变量(即要向用户显示的提示或说明) raw_input    是Py ...