场景

这几天做项目的时候遇到了个状态自动切换的场景。该场景具体情况如下:

用户可以创建多个活动

活动有开始时间和结束时间

活动有个状态:未上线、未开始(上线但未到开始时间)、进行中(上线且处于开始时间和结束时间之间)、已结束(上线且处于活动结束时间之后)

在上诉条件下自动切换活动状态,切换时间点为:活动开始时间(未开始->进行中);活动结束时间(进行中->已结束)

分析

根据场景中出现的情况,一个定时器就可以解决问题,只需要添加定时任务在指定时间进行活动状态切换即可。可以在活动上线的时候为每个活动创建一个定时任务,由于活动可以在进行中下线,所以在执行上线操作的时候需要判断上线后的活动状态,然后根据活动当前状态创建当时任务;在活动下线的时候关闭该活动的任务。

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实现任务动态增加和删除相关推荐

  1. 移除动态view android,请教Android,动态添加到控件能动态删除吗?

    可以的.有2中方式: 1.动态添加的时候为组件设置id,删除的时候根据id查找到对应组件,然后删除 2.根据父节点,获取所有父组件下的子组件,然后依次删除. 示例: protected View cr ...

  2. android 动态添加删除控件,求教Android,动态添加到控件能动态删除吗?

    protected View createView() {//动态添加组件 Button btn = new Button(this);//动态创建按钮 btn.setId(index++); btn ...

  3. jquery 动态添加一行数据,支持动态删除

    2019独角兽企业重金招聘Python工程师标准>>> 简介: 1.隐藏一个模板: 2.使用clone方法: 3.修改clone后的代码: 详细过程: 1.html代码 <tr ...

  4. vue给html动态添加属性,Vue中怎么动态添加类名?

    能够向组件添加动态类名是非常强大的功能.它使我们可以更轻松地编写自定义主题,根据组件的状态添加类,还可以编写依赖于样式的组件的不同变体. 添加动态类名与在组件中添加 prop :class=" ...

  5. java 动态添加定时器_Spring整合Quartz实现动态定时器的示例代码

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

  6. antd tree 动态添加_推荐三款动态壁纸软件,足够让你的桌面惊艳!

    点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达今天给大家推荐三款动态壁纸软件,给你的桌面添加一点精彩,心情也更美呢 ~ 1,WinDyn ...

  7. python列表动态添加_在Python中动态创建列表

    我有一堆与不同组关联的项,我最终想为每个组创建一个列表,其中包含所有关联项.在 问题是我不知道有多少组,所以如何动态生成正确数量的列表,以及如何调用它们?在 我在循环item_list和group_l ...

  8. android动态添加xml布局,android – 如何动态添加视图已经在xml布局中声明的RelativeLayout?...

    为第二个添加的Button LayoutParams添加规则RelativeLayout.RIGHT_OF: // first Button RelativeLayout rLayout = (Rel ...

  9. vmware虚拟机动态添加硬盘识别不了新增加的硬盘

    1.查看/proc/scsi/scsi文件 2.执行识别命令 # echo "scsi add-single-device w x y z" > /proc/scsi/scs ...

最新文章

  1. 你所未知的3种 Node.js 代码优化方式
  2. SpringBoot2.0 基础案例(06):引入JdbcTemplate,和多数据源配置
  3. Linux unit 5
  4. 跨域问题:Access-Control-Allow-Origin
  5. Autodesk正在招聘Civil、Infraworks金牌支持工程师(Premium Support Specialist)
  6. 自主研发的车牌识别SDK
  7. python求平面n个两两间距离_任意两平面求夹角|Python练习系列[11]
  8. oracle12c的特点,Oracle12c新特点详述
  9. 物联网让生活更加轻松的五种方式
  10. 【PHP】保留两位小数并向上取整
  11. iib 里面wsdl调用的坑
  12. 实现微信通知提醒的方法总结
  13. 数据技术嘉年华专列10月28日抵达广州,请做好接站准备
  14. chatbot聊天机器人环境搭建以及项目运行指南
  15. 视频批量截取方法,怎样同时对多个视频的一部分进行截取?
  16. 远程监控Swift生产服务器运行
  17. 假如唐诗评选第一,您选哪一首?大数据排名前10的唐诗您知道吗
  18. 从南宋临安城武林夜市到二维码收款,IoT 语音播报音箱的普及
  19. 基于PHP的OA办公系统项目
  20. html和css制作上三角和下三角

热门文章

  1. 基于深度学习的信息抽取技术
  2. pytorch 和 tensorflow2.0 方法替换
  3. Centos7搭建Redis,同一服务器启动两个端口的Redis
  4. python---str和repr
  5. HDU 2089 不要62
  6. Python基本数据类型以及字符串
  7. 树状数组-神奇的二进制
  8. C/C++ scanf 函数中%s 和%c 的简单差别
  9. NodeJs系列二:你好,世界
  10. Redis应用场景(转)