`
my_corner
  • 浏览: 83478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

动态改变Quartz的调度时间

阅读更多
近日碰到一位友人提出的一个问题,如何动态的改变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,虽然可以实现动态的改变,不知道是否带来了其他的问题。
欢迎大家批评指正共同测试、验证!
分享到:
评论
2 楼 梅花簪 2013-03-15  
如果希望可以 在 web application 运行时动态修改任务时间,又可以设置复杂的时间表达式,除了了Quarz ,还有什么好的实现方式吗?
1 楼 ming123 2010-07-27  
动态改变时间了,用Quarz就不合适了吧

相关推荐

    spring mvc quartz 动态设置时间

    spring mvc quartz 动态设置时间,可以实现任务调度的暂停和重启,在页面实现一个功能,可以动态设置调度的表达式,可以开启暂停任务调度

    Quartz动态修改时间,java实现修改CronExpression方法

    下载导入就可以用,执行test类的main方法加载spring applicationContext.xml配置文件,启动Quartz定时器.修改spring配置文件的配置时间.详细看注释

    Java中使用Quartz进行任务调度常用操作

    包含Java中使用Quartz进行任务调度常用操作:设置开始时间、设置结束时间、简单触发器、Cron触发器、作业监听器、启动多个作业、查看所有作业、手动触发作业、传递参数、取消/删除作业、作业出错时自动再执行等代码...

    (动态多)定时任务源码自动运行调度后台执行

    1、spring 定时任务demo ...9、spring+quartz动态定时任务创建 +mybatis(包含quartz动态定时任务的) 10、C#实现的自定义定时任务 可定时运行 多任务运行 11、ETL定时任务(数据同步)(没有数据库,仅供参

    akka-quartz-scheduler:Quartz扩展和实用程序,用于Akka中的cron式调度

    阿卡石英计 Quartz扩展和实用程序,可... 这里的目标是为Akka提供一个调度系统,该调度系统与人们对Cron型作业的期望更加接近-设置可以长时间运行的ActorSystem,这些事件可以由Quartz启动。 目前尚无任何计划与分布式

    Java 项目中使用单线程 实现 Quartz-2.2.1 触发优先级 源码下载

    该示例将执行以下操作: 用一个工作线程创建一个调度... 安排三个不同优先级的触发器,第一次同时触发,第二次以错开的时间间隔触发; 启动Quartz Scheduler; 等待30秒让 Job 有机会触发触发器; 关闭调度程序;

    spring quartz

    spring quartz 设置定时,可以设置在规定时间内执行任务调度。

    详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    计时器具有不灵活的计划(仅能设置开始时间和重复间隔,没有基于日期,时间等);计时器不使用线程池(每个定时器一个线程);计时器没有真正的管理方案 – 你必须编写自己的机制,以便能够记住,组织和检索任务的...

    任务调度,java自动执行

    任务调度,java自动执行 任务调度,自己定义执行时间

    dropwizard-jobs:调度Dropwizard的Quartz集成

    作业在应用程序启动时运行以进行初始设置(也可以通过dropwizard中的托管实例来完成) 在关闭应用程序之前,作业在应用程序停止时运行(也可以通过dropwizard中的托管实例来完成) 在一定时间间隔后重复的作业需要...

    quartz的基本使用,配置job,jobdetail,trigger,Scheduler

    通过CronScheduleBuilder、SimpleScheduleBuilder设置时间规则。

    Spring boot整合Mybatis实现增删改查

    Spring boot,Mybatis的整合总是很麻烦,在此提供一个已经整合好三大框架的包,可以直接下载导入Myeclipse使用,项目基于Maven做依赖管理。...@Scheduled是单线程的,每次最多只有一个作业在运行,如果调度时间到了作

    Java源码 SpringMVC Mybatis Shiro Bootstrap Rest Webservice

    集成Quartz调度,可以用作定时调度平台(动态配置调度类、调度时间,使程序自动执行某些业务) 6. Lucene搜索引擎,可以将文件资料索引化,支持文件内容搜索、关键字搜索、高亮关键字等,使信息在毫秒内提取查询...

    java版oa源码下载-S2SH:Struts2,Hibernate,Spring三大框架的整合

    java版oa源码下载 S2SH Struts2,Hibernate,Spring三大框架的整合总是...5.集成了作业自动调度框架Quartz 2.2.2实现作业调度; 6.json插件使用Struts2自带的json插件; 7.包含了一个文件上传的功能和数据表导出为Excel下

    万能后台管理模板javaweb

    26. 备份定时器:quartz 2.2 强大的任务调度,多线程备份数据库,任务启动关闭异步操作 27. 数据库还原:历史备份记录,还原数据库 or 单表 ,统计备份时间和文件大小 28. SQL编辑器:强大的SQL编辑器,支持编辑语句...

    javaOA办公系统模块设计方案.pdf

    备份定时器:quartz 强⼤的任务调度,多线程备份数据库,任务启动关闭异步操作 21. 数据库还原:历史备份记录,还原数据库 or 单表(sqlserver不⽀持),统计备份时间和⽂件⼤⼩ 22. SQL编辑器:强⼤的SQL编辑器,⽀...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    搜索引擎技术:Lucene.Net、多线程开发、爬虫技术、网页分析、正则表达式、Log4Net日志框架、Quartz.Net定时作业调度。 大型互联网开发技术:代码生成、网页静态化、基于JQuery的Web2.0页面开发、AJAX、SEO、网站...

    J2eeFAST企业级快速开发平台 v2.0.8

    更新时间: 2020-08-11 资源类型: 国产软件 推荐等级: ★★★☆☆ 平台环境: JAVA/Mysql 作者主页: 点击查看 演示地址: 点击查看 详细介绍 – [ J2eeFAST企业级快速开发平台 v2.0.8 ] J2eeFAST 是一个Java EE...

Global site tag (gtag.js) - Google Analytics