package com.tech.jin.jobScheduler;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties; import org.apache.log4j.Logger;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory; public class JobUtil { private static Logger logger = Logger.getLogger(JobUtil.class);
private static StdSchedulerFactory schedulerFactory = null; private JobUtil(){} /**
* 调度器factory
* @return
*/
private static synchronized SchedulerFactory getSchedulerFactory(){
if(schedulerFactory==null){ schedulerFactory = new StdSchedulerFactory(); Properties p = new Properties();
p.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
p.put("org.quartz.threadPool.threadCount", "10"); try {
schedulerFactory.initialize(p);
} catch (SchedulerException e) {
logger.info(e);
}
}
return schedulerFactory;
} /**
* 添加任务
* @param job 要调用的job类
* @param jobName job名称
* @param cronExpression 任务触发时间表达式
* @param param 需要用到的参数,可在job类中的context获得
*/
public static void addJob(Job job,String jobName,String cronExpression,Map param){
Scheduler scheduler = null;
try { removeJob(jobName, job.getClass().getCanonicalName()+"Group");//删除原任务 scheduler = getSchedulerFactory().getScheduler(); JobDetail jobDetail = getJobDetail(job, jobName,param);
String jobGroup = jobDetail.getGroup();
CronTrigger cronTrigger = getCronTrigger(job, jobName,jobGroup, cronExpression); scheduler.scheduleJob(jobDetail, cronTrigger); logger.info("添加任务:"+jobName); startScheduler(); } catch (SchedulerException e) {
logger.error(e);
} } /**
* 对外停止任务调度器方法
*/
public static void stopJob(){
shutdownScheduler();
} /**
* 启动调度器
*/
protected static void startScheduler(){
Scheduler scheduler = null;
try {
scheduler = getSchedulerFactory().getScheduler();
//如果调度器未启动,启动调度器
if(scheduler!=null&&!scheduler.isStarted()){
scheduler.start();
}
} catch (SchedulerException e) {
logger.error(e);
}
} /**
* 关闭调度器,关闭后任务也都清除
*/
protected static void shutdownScheduler(){
Scheduler scheduler = null;
try {
scheduler = getSchedulerFactory().getScheduler();
//如果调度器未关闭,关闭调度器
if(scheduler!=null&&!scheduler.isShutdown()){
scheduler.shutdown();
}
} catch (SchedulerException e) {
logger.error(e);
}
} /**
* 获取JobDetail
* @param job
* @param param
* @return
*/
protected static JobDetail getJobDetail(Job job,String jobName,Map param){
Class jobClazz = job.getClass();
if(jobName==null||"".equals(jobName)){
jobName = jobClazz.getCanonicalName();
}
String jobGroup = jobClazz.getCanonicalName()+"Group"; JobDetail jobDetail = new JobDetail();
jobDetail.setDurability(true);
jobDetail.setRequestsRecovery(true);
jobDetail.setName(jobName);
jobDetail.setGroup(jobGroup);
jobDetail.setJobClass(jobClazz); if(param!=null&&param.size()>0){
JobDataMap jobDataMap = new JobDataMap(param);//存放参数
jobDetail.setJobDataMap(jobDataMap); logger.info("任务 "+jobName+" jobDetail存放的参数:"+param);
} return jobDetail;
} /**
* 获取触发器
* @param job
* @param jobName
* @param cronExpression
* @return
*/
protected static CronTrigger getCronTrigger(Job job,String jobName,String jobGroup,String cronExpression){
Class jobClazz = job.getClass();
String triggerName = jobClazz.getCanonicalName()+"Trigger";
String triggerGroup = jobClazz.getCanonicalName()+"TriggerGroup"; CronTrigger cronTrigger = new CronTrigger();
cronTrigger.setName(triggerName);
cronTrigger.setGroup(triggerGroup);
cronTrigger.setJobName(jobName);
cronTrigger.setJobGroup(jobGroup);
try {
cronTrigger.setCronExpression(cronExpression);//触发任务的时间表达式
} catch (ParseException e) {
logger.error(e);
} logger.info("任务 "+jobName+" 触发时间:"+cronExpression); return cronTrigger;
} /**
* 删除job
* @param jobName
* @param jobGroup
*/
public static void removeJob(String jobName,String jobGroup){ logger.info("删除任务:jobName:"+jobName +" jobGroup:"+jobGroup); Scheduler scheduler = null;
String[] jobNames = null;
try {
scheduler = getSchedulerFactory().getScheduler();
jobNames = scheduler.getJobNames(jobGroup);
if(jobNames==null||jobNames.length==0){
return;
}
for(String name:jobNames){
if(name.equals(jobName)){
scheduler.pauseTrigger(jobName, jobGroup);//停止触发器
scheduler.pauseJob(jobName, jobGroup);//暂停job
scheduler.unscheduleJob(jobName, jobGroup);//取消预订的job
scheduler.deleteJob(jobName, jobGroup);//删除job
}
} } catch (SchedulerException e) {
logger.error(e);
}
} /**
* 获取任务列表
* @return
*/
public static Map<String, List<String>> getJobList(){ Scheduler scheduler = null;
Map<String, List<String>> map = null;
try {
scheduler = getSchedulerFactory().getScheduler(); String[] jobGroupNames = scheduler.getJobGroupNames();
if(jobGroupNames==null||jobGroupNames.length==0){
return null;
} map = new HashMap<String, List<String>>(); for(String jobGroup :jobGroupNames){ String[] jobNames = scheduler.getJobNames(jobGroup);
if(jobNames==null||jobNames.length==0){
continue;
} List<String> jobNameList = new ArrayList<String>(); for(String jobName : jobNames){
jobNameList.add(jobName);
} map.put(jobGroup, jobNameList);
} } catch (SchedulerException e) {
logger.error(e);
} logger.info("获取job列表:"+map); return map;
} }

调用代码:

        Job job = new TestJob();
Map<String, String> map = new HashMap<String, String>();
map.put("key", "hello world");
JobUtil.addJob(job, job.getClass().getName(), "0/10 * * * * ?", map);

job类:

package com.tech.jin.job;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; public class TestJob implements Job{ @Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { //可以context中获取到之前存入jobDataMap中的参数
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
String value = (String)jobDataMap.get("key"); System.out.println(value); } }

java类中使用quartz,设置自动任务Demo的更多相关文章

  1. java 类中的细节

    java 中类: 类是用于描述统一类型的对象的一个抽象的概念,类中定义了这一类对象所因具有的静态和动态属性. 举例: 瓶子静态: 有一个口.长长的形状-->java类中的成员变量动态属性: 可以 ...

  2. 编写Java程序,实现对兵营类的封装,将兵营类中的所有属性设置为私有访问权限,方法设置为公有访问权限

    返回本章节 返回作业目录 需求说明: 实现对兵营类的封装 将兵营类中的所有属性设置为私有访问权限. 将兵营类中所有属性的赋值方法设置为公有访问权限. 要求兵营名称的长度在4-8位之间. 要求兵营士兵的 ...

  3. thymeleaf模板引擎调用java类中的方法(附源码)

    前言 <Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦> 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决 ...

  4. java类中根据已有的变量复写类的toString方法

    java类中根据已有的变量复写类的toString方法: 在该类中定义好变量之后,shift+alt+s,从出现的列表中点击gemerate toString,就会自动生成对应的toString方法.

  5. Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)

    今天重装系统,安装了新的Myeclipse后,导入之前的项目后,,出现了乱码问题.乱码问题主要是java类中的注释,而jsp页面中汉字却完好如初: 右键项目,查看项目的编码格式,UTF-8,把java ...

  6. Java类中中文问题

    一个奇怪问题 java类中要保存一个xml文件到数据库,2种传值方式其中1种不知何故会最终导致解析xml时报错. xml文件内容由StringBuffer定义,其中一段内容如下: sb.append( ...

  7. java类中定义接口

    今天看到一个java类中定义了接口,写个备忘录,记录一下 package com.gxf.test; public class Test_interface { public interface sh ...

  8. Jsp中如何通过Jsp调用Java类中的方法

    Jsp中如何通过Jsp调用Java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:cn.tianaoweb.com; 2.再在包中添加一个类:如 package com; public ...

  9. java类中为什么设置set和get方法操作属性

    java程序规范中会建议大家尽量将类中的属性私有化,即定义为private变量,通过设置set和get函数来对属性进行操作.一些人存在这样的疑问,为什么不直接将属性设置为public,以后调用属性时直 ...

随机推荐

  1. Charles 使用教程

    Charles 的简介 如何安装 Charles 将 Charles 设置成系统代理 Charles 主界面介绍 过滤网络请求 截取 iPhone 上的网络封包 截取 Https 通讯信息 模拟慢速网 ...

  2. 梯度下降法(BGD、SGD)、牛顿法、拟牛顿法(DFP、BFGS)、共轭梯度法

    一.梯度下降法 梯度:如果函数是一维的变量,则梯度就是导数的方向:      如果是大于一维的,梯度就是在这个点的法向量,并指向数值更高的等值线,这就是为什么求最小值的时候要用负梯度 梯度下降法(Gr ...

  3. Mac下android studio卡,居然这么解决了。。。。

    一直修改build.app直接卡死.... 最后把网线拨了,居然不卡了.. 直接设置代理为127.0.0.1直接不卡了,无语了...

  4. 用log4net记录日志信息

    在.net中用log4net记录日志信息,已经是很平常的事情了. log4net下载:http://logging.apache.org/log4net/download_log4net.cgi 百度 ...

  5. Oracle 10g使用amdu抽取数据文件

    环境:OEL 5.7 + Oracle 10.2.0.5 RAC 需求:实验在Oracle 10g环境使用amdu抽取数据库文件 本文主要目的是介绍3个知识点: 1.使amdu可以在oracle 10 ...

  6. mysql数据库表设计小数类型

    float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效 ...

  7. 并查集(disjoint)

    合并,查找的集合 第一,建立两个函数,一个用来查找(find),一个用来合并(merge): 如下的一个模板: 题目: 亲戚(Relations) 或许你并不知道,你的某个朋友是你的亲戚.他可能是你的 ...

  8. 如何让多个dz论坛共用一个用户数据库

    用户数据库在论坛中是可以独立备份的,备份方法:论坛后台——站长——数据库,备份所有ucenter数据表,也就是用户数据.其他DZ论坛搭建完成以后,可以上传用户数据库,将备份文件使用上传至网站所使用的主 ...

  9. Rpgmakermv(30) GameQuest任务插件

    插件简介: 很牛X的任务插件(个人目前用过中的) 插件用法说明 Report any bugs, editor or plugin related here: http://forums.rpgmak ...

  10. Linux 查看磁盘或文件夹及文件大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.    du可以查看文件及文件夹的大小. ...