java 动态添加定时器_quartz实现任务动态增加和删除
场景
这几天做项目的时候遇到了个状态自动切换的场景。该场景具体情况如下:
用户可以创建多个活动
活动有开始时间和结束时间
活动有个状态:未上线、未开始(上线但未到开始时间)、进行中(上线且处于开始时间和结束时间之间)、已结束(上线且处于活动结束时间之后)
在上诉条件下自动切换活动状态,切换时间点为:活动开始时间(未开始->进行中);活动结束时间(进行中->已结束)
分析
根据场景中出现的情况,一个定时器就可以解决问题,只需要添加定时任务在指定时间进行活动状态切换即可。可以在活动上线的时候为每个活动创建一个定时任务,由于活动可以在进行中下线,所以在执行上线操作的时候需要判断上线后的活动状态,然后根据活动当前状态创建当时任务;在活动下线的时候关闭该活动的任务。
java解决定时任务的方法较为常用的是有两种方法:java.util.Timer 和org.quartz;这两种方式各有起优缺点,Timer实现起来非常简单,只需要实现一个TimerTask即可进行定时任务调度,但是Timer定时任务存在几个缺点导致在实际开发中很少用其作为定时器,以下是timer和quartz相比的不足:
java定时器没有持久化机制
java定时器的日程管理不够灵活
java定时器没有使用线程池
java定时器么有确切的管理方案
生成环境中更多是使用quartz来做定时任务的开发,本文主要讲解quartz如何添加定时任务和删除定时任务。
quartz介绍
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。
job quartz核心任务接口,实现execute方法即可
jobDetail quartz为调度器可以识别的任务详情对象,该对象包含任务的唯一key值,以及任务人发执行所需参数等
trigger 任务执行触发器,指定任务执行时间等
scheduler quartz核心调度器,将jobDetail和trigger结合起来调度定时任务
实现案例(并非解决上诉场景代码)
实现Job接口
package java;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* Created by Lethe on 2017/3/29.
* 该任务将在被触发的时候将输出: hello ${name}
*/
public class QuartzJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap map = jobExecutionContext.getJobDetail().getJobDataMap();
System.out.println("hello "+ map.getString("name"));
}
}
任务调度
package org.hanmeis;
import org.quartz.JobDataMap;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.JobDetailImpl;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.triggers.CronTriggerImpl;
import java.text.ParseException;
/**
* Created by Lethe on 2017/3/29.
*/
public class SchedulerTest {
public static void main(String[] args) throws SchedulerException, ParseException {
// 构造调度器,使用标准调度器工厂获取默认的调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
JobDataMap dataMap = new JobDataMap();
dataMap.put("name", "world");
// 构造JobDetail,使用默认的JobDetailImpl类
JobDetailImpl detail = new JobDetailImpl();
detail.setJobClass(QuartzJob.class);
detail.setJobDataMap(dataMap);
detail.setName("testJob");
// 构造Trigger,使用CronTrigger
CronTriggerImpl cronTrigger = new CronTriggerImpl();
cronTrigger.setCronExpression("00 * 15 29 3 ? 2017");// 如果仅需在指定时间执行一次任务,则表达式一般写法为:00 50 15 29 3 ? 2017(表示在2017-03-29 15:50:00执行任务)
cronTrigger.setName("testTrigger");
// 调度任务
scheduler.scheduleJob(detail, cronTrigger);
}
}
任务动态增加和删除
scheduler本身提供任务的装载、卸载及刷新等接口
Date scheduleJob(JobDetail jobDetail, Trigger trigger) throws SchedulerException;
Date scheduleJob(Trigger trigger) throws SchedulerException;
void scheduleJobs(Map> triggersAndJobs, boolean replace) throws SchedulerException;
void scheduleJob(JobDetail jobDetail, Set extends Trigger> triggersForJob, boolean replace) throws SchedulerException;
boolean unscheduleJob(TriggerKey triggerKey) throws SchedulerException;
boolean unscheduleJobs(List triggerKeys) throws SchedulerException;
Date rescheduleJob(TriggerKey triggerKey, Trigger newTrigger) throws SchedulerException;
引用
quartz[互动百科]:http://www.baike.com/wiki/Quartz
Timer和spring的Quartz两种定时器的区别[CSDN]:http://blog.csdn.net/zlxdream815/article/details/8177574
java 动态添加定时器_quartz实现任务动态增加和删除相关推荐
- 移除动态view android,请教Android,动态添加到控件能动态删除吗?
可以的.有2中方式: 1.动态添加的时候为组件设置id,删除的时候根据id查找到对应组件,然后删除 2.根据父节点,获取所有父组件下的子组件,然后依次删除. 示例: protected View cr ...
- android 动态添加删除控件,求教Android,动态添加到控件能动态删除吗?
protected View createView() {//动态添加组件 Button btn = new Button(this);//动态创建按钮 btn.setId(index++); btn ...
- jquery 动态添加一行数据,支持动态删除
2019独角兽企业重金招聘Python工程师标准>>> 简介: 1.隐藏一个模板: 2.使用clone方法: 3.修改clone后的代码: 详细过程: 1.html代码 <tr ...
- vue给html动态添加属性,Vue中怎么动态添加类名?
能够向组件添加动态类名是非常强大的功能.它使我们可以更轻松地编写自定义主题,根据组件的状态添加类,还可以编写依赖于样式的组件的不同变体. 添加动态类名与在组件中添加 prop :class=" ...
- java 动态添加定时器_Spring整合Quartz实现动态定时器的示例代码
一.版本说明 spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错. 原因:spring对于quartz的支持实现,org.springf ...
- antd tree 动态添加_推荐三款动态壁纸软件,足够让你的桌面惊艳!
点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达今天给大家推荐三款动态壁纸软件,给你的桌面添加一点精彩,心情也更美呢 ~ 1,WinDyn ...
- python列表动态添加_在Python中动态创建列表
我有一堆与不同组关联的项,我最终想为每个组创建一个列表,其中包含所有关联项.在 问题是我不知道有多少组,所以如何动态生成正确数量的列表,以及如何调用它们?在 我在循环item_list和group_l ...
- android动态添加xml布局,android – 如何动态添加视图已经在xml布局中声明的RelativeLayout?...
为第二个添加的Button LayoutParams添加规则RelativeLayout.RIGHT_OF: // first Button RelativeLayout rLayout = (Rel ...
- vmware虚拟机动态添加硬盘识别不了新增加的硬盘
1.查看/proc/scsi/scsi文件 2.执行识别命令 # echo "scsi add-single-device w x y z" > /proc/scsi/scs ...
最新文章
- 你所未知的3种 Node.js 代码优化方式
- SpringBoot2.0 基础案例(06):引入JdbcTemplate,和多数据源配置
- Linux unit 5
- 跨域问题:Access-Control-Allow-Origin
- Autodesk正在招聘Civil、Infraworks金牌支持工程师(Premium Support Specialist)
- 自主研发的车牌识别SDK
- python求平面n个两两间距离_任意两平面求夹角|Python练习系列[11]
- oracle12c的特点,Oracle12c新特点详述
- 物联网让生活更加轻松的五种方式
- 【PHP】保留两位小数并向上取整
- iib 里面wsdl调用的坑
- 实现微信通知提醒的方法总结
- 数据技术嘉年华专列10月28日抵达广州,请做好接站准备
- chatbot聊天机器人环境搭建以及项目运行指南
- 视频批量截取方法,怎样同时对多个视频的一部分进行截取?
- 远程监控Swift生产服务器运行
- 假如唐诗评选第一,您选哪一首?大数据排名前10的唐诗您知道吗
- 从南宋临安城武林夜市到二维码收款,IoT 语音播报音箱的普及
- 基于PHP的OA办公系统项目
- html和css制作上三角和下三角