项目ITP(七) javaWeb 整合 Quartz 实现动态调度 并且 持久化
原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下!
弟子规 圣人训 首孝弟 次谨信 泛爱众 而亲仁 有余力 则学文
Written In The Font
需要:
- 导入WEB-INF/lib/quartz-2.2.1.jar
- 然后数据库建相关表格,可以去quartz-2.2.1\docs\dbTables目录下找到对应的数据库表格.(我这边Mysql , 导入 tables_mysql.sql 即可)
- 配置quartz.properties
- #============================================================================
- # Configure Main Scheduler Properties
- #============================================================================
- org.quartz.scheduler.instanceName: wmuitpScheduler
- org.quartz.scheduler.instanceId: AUTO
- org.quartz.scheduler.skipUpdateCheck: true
- #============================================================================
- # Configure ThreadPool
- #============================================================================
- org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
- org.quartz.threadPool.threadCount: 10
- org.quartz.threadPool.threadPriority: 5
- org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
- #============================================================================
- # Configure JobStore
- #============================================================================
- org.quartz.jobStore.misfireThreshold: 60000
- org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
- org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
- org.quartz.jobStore.useProperties=false
- org.quartz.jobStore.dataSource=myDS
- org.quartz.jobStore.tablePrefix=qrtz_
- org.quartz.jobStore.isClustered=true
- #============================================================================
- # Configure Datasources
- #============================================================================
- org.quartz.dataSource.myDS.driver: com.mysql.jdbc.Driver
- org.quartz.dataSource.myDS.URL: jdbc:mysql://localhost:3307/itp
- org.quartz.dataSource.myDS.user: root
- org.quartz.dataSource.myDS.password: 123456
- org.quartz.dataSource.myDS.maxConnections: 5
- org.quartz.dataSource.myDS.validationQuery: select 0
- #============================================================================
基本步骤:
- web.xml注册监听器ScheduleStartListener
- 监听器类sedion.jeffli.wmuitp.listener.ScheduleStartListener实现
- 测试案例第一步: Job 接口实现类JobTest
- 测试案例第二步:QuartzTest
web.xml注册监听器ScheduleStartListener
注册quartz监听器,监听项目是否启动或者重启.保证项目启动或重启时,所有任务会被重新安排到任务调度中.
web.xml添加一个Listener:
- <!-- quartz监听器 -->
- <listener>
- <listener-class>sedion.jeffli.wmuitp.listener.ScheduleStartListener</listener-class>
- </listener>
监听器类sedion.jeffli.wmuitp.listener.ScheduleStartListener实现
监听器类主要是实现recovery各个任务,重新恢复在triggerGroups组中所有的触发器,按新的trigger重新设置job执行.顺便说下,这个异常自定义(不需要删除即可): sedion.jeffli.wmuitp.exception.QuartzException;
- package sedion.jeffli.wmuitp.listener;
- import java.util.List;
- import javax.servlet.ServletContextEvent;
- import javax.servlet.ServletContextListener;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerFactory;
- import org.quartz.Trigger;
- import org.quartz.TriggerKey;
- import org.quartz.impl.StdSchedulerFactory;
- import sedion.jeffli.wmuitp.exception.QuartzException;
- public class ScheduleStartListener implements ServletContextListener
- {
- public void contextDestroyed(ServletContextEvent sce)
- {
- }
- public void contextInitialized(ServletContextEvent sce)
- {
- try
- {
- recovery();
- }
- catch (Exception e)
- {
- throw new QuartzException(" ScheduleStartListener contextInitialized ERROR!!",e);
- }
- }
- public void recovery()
- {
- Scheduler scheduler = null;
- try {
- SchedulerFactory schedulerFactory = new StdSchedulerFactory();
- scheduler = schedulerFactory.getScheduler();//可以通过SchedulerFactory创建一个Scheduler实例
- List<String> triggerGroups = scheduler.getTriggerGroupNames();//获取调度器中所有的触发器组
- System.out.println("调度器中所有的触发器组 size():"+triggerGroups.size());
- if(triggerGroups != null && triggerGroups.size() != 0)//重新恢复在triggerGroups组中所有的触发器
- {
- for (int i = 0; i < triggerGroups.size(); i++)
- {
- TriggerKey triggerKey = TriggerKey.triggerKey(triggerGroups.get(i), triggerGroups.get(i));
- System.out.println("triggerKey:"+triggerKey);
- Trigger tg = scheduler.getTrigger(triggerKey);//获取trigger
- System.out.println(triggerKey+" -> 执行时间 :"+tg.getNextFireTime());
- scheduler.rescheduleJob(triggerKey, tg);//按新的trigger重新设置job执行
- }
- }
- scheduler.start();
- }
- catch (Exception e)
- {
- throw new QuartzException("ScheduleStartListener recovery() Error!", e);
- }
- }
- }
测试案例第一步: Job 接口实现类JobTest
顾名思义,用于自定义任务,方法的实现.你可以在其中写入任意你想要在那个点上干的事情(操作数据库,前台显示等).在下面那处地方写入你想要写的:System.out.println("添入需要加入任务的具体操作"); .顺便说下,这个异常自定义(不需要删除即可):
- package test.quartz;
- import org.quartz.Job;
- import org.quartz.JobDataMap;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.quartz.JobKey;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerException;
- import org.quartz.SchedulerFactory;
- import org.quartz.TriggerKey;
- import org.quartz.impl.StdSchedulerFactory;
- import sedion.jeffli.wmuitp.exception.QuartzException;
- public class JobTest implements Job{
- public JobTest() {}
- public void execute(JobExecutionContext context)throws JobExecutionException
- {
- JobDataMap data = context.getJobDetail().getJobDataMap();
- System.out.println("data.testId : "+data.getInt("testId")); //不需要可删除
- try
- {
- System.out.println("添入需要加入任务的具体操作");
- }
- catch (Exception e)
- {
- throw new QuartzException("JobTest execute() ERROR !!", e);
- }
- }
- public static void removeJob(JobKey jobKey, TriggerKey tiKey)throws SchedulerException
- {
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- sched.pauseTrigger(tiKey); //停止触发器
- sched.unscheduleJob(tiKey); //移除触发器
- sched.deleteJob(jobKey); //删除任务
- }
- }
测试案例第二步:QuartzTest
顾名思义,用于实现,检验.可以通过SchedulerFactory创建一个Scheduler实例,把触发器在集群节点实例命名的组只是为了区分(伐木)从什么地方定问调度重新执行此作业,如果它是正在进行时调度下去.
- package test.quartz;
- import static org.quartz.JobBuilder.newJob;
- import static org.quartz.TriggerBuilder.newTrigger;
- import java.util.Date;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerFactory;
- import org.quartz.SimpleTrigger;
- import org.quartz.impl.StdSchedulerFactory;
- public class QuartzTest
- {
- public void run(String date, int id)throws Exception
- {
- SchedulerFactory schedulerFactory = new StdSchedulerFactory();
- Scheduler scheduler = schedulerFactory.getScheduler();//可以通过SchedulerFactory创建一个Scheduler实例
- //设置工作详情
- JobDetail job = newJob(JobTest.class)
- .withIdentity("job_"+id, "test"+id) // (String name, String group)把触发器在集群节点实例命名的组只是为了区分(伐木)从什么地方定问调度重新执行此作业,如果它是正在进行时调度下去...
- .requestRecovery()
- .build();
- job.getJobDataMap().put("testId", id); //设置存储参数(不需要可删除)
- Date startDate = FormatDate.stringToDateAll(date);//Date转String
- //设置触发器
- SimpleTrigger trigger = (SimpleTrigger) newTrigger()
- .withIdentity("overdue"+id, "overdue"+id)//withIdentity("trigger", "group")
- .startAt(startDate)
- .build();
- scheduler.scheduleJob(job, trigger);
- scheduler.start();
- System.out.println("------- Start Scheduler ----------------");
- }
- public static void main(String[] args) throws Exception
- {
- QuartzTest quartzOverdue = new QuartzTest();
- quartzOverdue.run("2014-07-02 00:30:00",666);//666,随便的吉祥数字
- }
- }
这边,项目tomcat启动.这边我的主机时间是:
然后我们运行:
- public static void main(String[] args) throws Exception
- {
- QuartzTest quartzOverdue = new QuartzTest();
- quartzOverdue.run("2014-07-02 00:30:00",666);//666,随便的吉祥数字
- }
看控制台:
先输出
- ------- Start Scheduler ----------------
然后时间到了
- 添入需要加入任务的具体操作
然后测试 quartz的持久化.(持久化测试就是 先开启任务,然后 中间断开重启服务器),之间你会发现控制台:
今天我重写了下,:
- public static void main(String[] args) throws Exception
- {
- QuartzTest quartzOverdue = new QuartzTest();
- quartzOverdue.run("2014-07-02 10:00:00",6666);
- }
- 调度器中所有的触发器组 size():1
- triggerKey:test6666.test6666
- test6666.test6666 -> 执行时间 :Wed Jul 02 10:00:00 CST 2014
项目ITP(七) javaWeb 整合 Quartz 实现动态调度 并且 持久化的更多相关文章
- 项目ITP(七) javaWeb 整合 Quartz 实现动态调度 而且 持久化
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010378410/article/details/36255511 项目ITP(七) javaWe ...
- 项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!
前言 系列文章:[传送门] 洗了个澡,准备写篇博客.然后看书了.时间 3 7 分.我慢慢规律生活,向目标靠近. 很喜欢珍惜时间像叮当猫一样 正文 慢慢地,二维码实现签到将要落幕了.下篇文章出二维码实 ...
- 项目ITP(六) spring4.0 整合 Quartz 实现动态任务调度
前言 系列文章:[传送门] 项目需求: http://www.cnblogs.com/Alandre/p/3733249.html 上一博客写的是基本调度,后来这只能用于,像每天定个时间 进行数据库备 ...
- 项目ITP(五) spring4.0 整合 Quartz 实现任务调度
前言 系列文章:[传送门] 项目需求: 二维码推送到一体机上,给学生签到扫描用.然后需要的是 上课前20分钟 ,幸好在帮带我的学长做 p2p 的时候,接触过.自然 quartz 是首选.所以我就配置了 ...
- SSM项目整合Quartz
一.背景 SSM项目中要用到定时器,初期使用Timer,后来用spring 的schedule,都比较简单,所以功能比较单一而且他们不能动态的配置时间.后来就研究quartz,准备整合到项目中.Qua ...
- 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】
初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...
- Spring 3整合Quartz 2实现手动设置定时任务:新增,修改,删除,暂停和恢复(附带源码)
摘要:在项目的管理功能中,对定时任务的管理有时会很常见.但一般定时任务配置都在xml中完成,包括cronExpression表达式,十分的方便.但是如果我的任务信息是保存在数据库的,想要动态的初始化, ...
- 【淘淘】Spring整合Quartz框架
我在外面工作实习的时候,我们做的项目是一个日报子系统,也就是定时定点为公司生成一些报表数据还有一些数据反馈.这时候我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.当时,我做 ...
- Spring整合Quartz实现持久化、动态设定时间
一.spring整合 网上一搜有很多整合的方式,这里我采用了其中的一种(暂时还没有对其他的方法研究过). 对于spring的整合其中的任务,spring提供了几个类.接口(这些类都实现了Job接口): ...
随机推荐
- pyc文件
1.pyc文件 是python预编译后的字节码文件,并不是机器码.2.PyCodeObject 是Python编译器真正编译成的结果: 当python程序运行时,编译的结果是保存在PyCodeObje ...
- java中如何使用break跳出多重循环
java 中已知的三种跳出多重循环的方式: System.out.println("---------java中跳出多重循环的三种方式:---------"); System.ou ...
- mysql 统计某个月每天的数据
select SUM(order_money) as money,substr(t.pay_time,1,10) as time from pay_log t where t.pay_time l ...
- rn下的弹性布局
重点: 1]react native 下的弹性布局名字叫:flexDirection 2]flexDirection的默认值是column而不是row,而flex也只能指定一个数字值. 3]使用fle ...
- CentOS7配置阿里云源
cd /etc/yum.repos.d/ mkdir backup mv CentOS-* backup/ wget -O /etc/yum.repos.d/CentOS-Base.repo http ...
- mongodb聚合操作
1. mongodb的聚合是什么 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组.过滤等功能,然后经过一系列的处理 ...
- Leetcode(二)两数相加
两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链 ...
- Email发展历史
据我所知:1987年9月20日,有“中国互联网第一人”之称的钱天白从北京经意大利向前联邦德国卡尔斯鲁厄大学发出了中国第一封电子邮件,内容是“ 穿越长城,走向世界”.这是中国人在网络上的第一步,他开创了 ...
- 利用python完成大学刷课(从0到完成的思路)
i春秋作家:tllm 原文来自:利用python完成大学刷课(从0到完成的思路) 最近刚刚开学,学校总是有很多让人无语的课要修,还不能不修.然后我想写一个自动修课的脚本.大佬们不要笑我 是边面向百度学 ...
- git知识整理
概述 工作中使用git进行代码托管,一开始只知道git add commit,之后了解了git-flow插件,觉得超牛逼,一键生成feature分支,再后来听说原生git命令更好用,于是又去学了原生g ...