近日碰到一位友人提出的一个问题,如何动态的改变Quartz的调度作业的时间。比如,由每10分钟执行一次改为每5分钟执行一次。个人认为这种需求应该通过某种方式来规避,或者选用其他的技术框架,因为动态改变Quartz的调度时间完全失去了使用Quartz的意义。本人在使用Quartz是基于Spring来配置的,而朋友的项目中不能使用SPring框架,这就需要直接基于Quartz编程。工作之余,写了个例子:
Quartz的管理类
public class QuartzManage {
private static SchedulerFactory sf = new StdSchedulerFactory();
private static String JOB_GROUP_NAME = "group";
private static String TRIGGER_GROUP_NAME = "trigger";
public static void startJob(String jobName, Job job, String time)
throws SchedulerException, ParseException {
Scheduler sched = sf.getScheduler();
JobDetail jobDetail = new JobDetail();
jobDetail.setName(jobName);
jobDetail.setGroup(JOB_GROUP_NAME);
jobDetail.setJobClass(job.getClass());
CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);
trigger.setCronExpression(time);
sched.scheduleJob(jobDetail, trigger);
if (!sched.isShutdown()) {
sched.start();
}
}
/**
* 从Scheduler 移除当前的Job,修改Trigger
*
* @param jobDetail
* @param time
* @throws SchedulerException
* @throws ParseException
*/
public static void modifyJobTime(JobDetail jobDetail, String time)
throws SchedulerException, ParseException {
Scheduler sched = sf.getScheduler();
Trigger trigger = sched.getTrigger(jobDetail.getName(),
TRIGGER_GROUP_NAME);
if (trigger != null) {
CronTrigger ct = (CronTrigger) trigger;
// 移除当前进程的Job
sched.deleteJob(jobDetail.getName(), jobDetail.getGroup());
// 修改Trigger
ct.setCronExpression(time);
System.out.println("CronTrigger getName " + ct.getJobName());
// 重新调度jobDetail
sched.scheduleJob(jobDetail, ct);
}
}
}
Job任务:
public class JobTest implements Job {
static int a = 0;
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
a += 1;
System.out.println("test ++++++++++++++++++++++a=" + a);
if (a == 4) {
try {
QuartzManage.modifyJobTime(context.getJobDetail(),
"0/10 * * * * ?");
} catch (SchedulerException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
启动线程执行调度:
public class QuartzTest {
public static void main(String[] args) throws SchedulerException,
ParseException {
/*
* 此进程为主进程,触发了quartz对Job的调度 因此启动Job之后,在该进程修改调度,是没有效果的
*/
JobTest job = new JobTest();
QuartzManage.startJob("ming", job, "0/2 * * * * ?");
}
}
好多人的思路是在启动的主线程内去改变调度的时间,简单的分析就可发现,主线程启动之后就会按照调度时间去运行Job,不会返回主线程再去加载调度时间,只是起到了触发调度的操作。因此要进行动态的修改调度时间,需要在Job任务里,动态改变当前线程的调度计划。
测试代码,开始时按每2秒执行一次打印a,当a打印4次以后,按照每10秒一次执行。虽然代码测试成功,本人还有疑惑。
// 移除当前进程的Job
sched.deleteJob(jobDetail.getName(), jobDetail.getGroup());
先移除当前的Job任务,在按照新的调度时间加入新的Job,虽然可以实现动态的改变,不知道是否带来了其他的问题。
欢迎大家批评指正共同测试、验证!
分享到:
相关推荐
spring mvc quartz 动态设置时间,可以实现任务调度的暂停和重启,在页面实现一个功能,可以动态设置调度的表达式,可以开启暂停任务调度
下载导入就可以用,执行test类的main方法加载spring applicationContext.xml配置文件,启动Quartz定时器.修改spring配置文件的配置时间.详细看注释
包含Java中使用Quartz进行任务调度常用操作:设置开始时间、设置结束时间、简单触发器、Cron触发器、作业监听器、启动多个作业、查看所有作业、手动触发作业、传递参数、取消/删除作业、作业出错时自动再执行等代码...
1、spring 定时任务demo ...9、spring+quartz动态定时任务创建 +mybatis(包含quartz动态定时任务的) 10、C#实现的自定义定时任务 可定时运行 多任务运行 11、ETL定时任务(数据同步)(没有数据库,仅供参
阿卡石英计 Quartz扩展和实用程序,可... 这里的目标是为Akka提供一个调度系统,该调度系统与人们对Cron型作业的期望更加接近-设置可以长时间运行的ActorSystem,这些事件可以由Quartz启动。 目前尚无任何计划与分布式
该示例将执行以下操作: 用一个工作线程创建一个调度... 安排三个不同优先级的触发器,第一次同时触发,第二次以错开的时间间隔触发; 启动Quartz Scheduler; 等待30秒让 Job 有机会触发触发器; 关闭调度程序;
spring quartz 设置定时,可以设置在规定时间内执行任务调度。
计时器具有不灵活的计划(仅能设置开始时间和重复间隔,没有基于日期,时间等);计时器不使用线程池(每个定时器一个线程);计时器没有真正的管理方案 – 你必须编写自己的机制,以便能够记住,组织和检索任务的...
任务调度,java自动执行 任务调度,自己定义执行时间
作业在应用程序启动时运行以进行初始设置(也可以通过dropwizard中的托管实例来完成) 在关闭应用程序之前,作业在应用程序停止时运行(也可以通过dropwizard中的托管实例来完成) 在一定时间间隔后重复的作业需要...
通过CronScheduleBuilder、SimpleScheduleBuilder设置时间规则。
Spring boot,Mybatis的整合总是很麻烦,在此提供一个已经整合好三大框架的包,可以直接下载导入Myeclipse使用,项目基于Maven做依赖管理。...@Scheduled是单线程的,每次最多只有一个作业在运行,如果调度时间到了作
集成Quartz调度,可以用作定时调度平台(动态配置调度类、调度时间,使程序自动执行某些业务) 6. Lucene搜索引擎,可以将文件资料索引化,支持文件内容搜索、关键字搜索、高亮关键字等,使信息在毫秒内提取查询...
java版oa源码下载 S2SH Struts2,Hibernate,Spring三大框架的整合总是...5.集成了作业自动调度框架Quartz 2.2.2实现作业调度; 6.json插件使用Struts2自带的json插件; 7.包含了一个文件上传的功能和数据表导出为Excel下
26. 备份定时器:quartz 2.2 强大的任务调度,多线程备份数据库,任务启动关闭异步操作 27. 数据库还原:历史备份记录,还原数据库 or 单表 ,统计备份时间和文件大小 28. SQL编辑器:强大的SQL编辑器,支持编辑语句...
备份定时器:quartz 强⼤的任务调度,多线程备份数据库,任务启动关闭异步操作 21. 数据库还原:历史备份记录,还原数据库 or 单表(sqlserver不⽀持),统计备份时间和⽂件⼤⼩ 22. SQL编辑器:强⼤的SQL编辑器,⽀...
搜索引擎技术:Lucene.Net、多线程开发、爬虫技术、网页分析、正则表达式、Log4Net日志框架、Quartz.Net定时作业调度。 大型互联网开发技术:代码生成、网页静态化、基于JQuery的Web2.0页面开发、AJAX、SEO、网站...
更新时间: 2020-08-11 资源类型: 国产软件 推荐等级: ★★★☆☆ 平台环境: JAVA/Mysql 作者主页: 点击查看 演示地址: 点击查看 详细介绍 – [ J2eeFAST企业级快速开发平台 v2.0.8 ] J2eeFAST 是一个Java EE...