`
my_corner
  • 浏览: 84500 次
  • 性别: 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 动态设置时间】 在Java Web开发中,Spring MVC和Quartz库经常被用来构建灵活的任务调度系统。Quartz是一个强大的、开放源码的作业调度框架,可以用于创建、调度和执行重复任务。而Spring MVC...

    Spring Quartz如何动态配置时间

    在 Quartz 任务调度器中,我们需要更新任务触发器的时间设置,以便于任务可以根据新的时间规则来执行。 6. RESCHEDULE THE JOB 最后,我们需要重新安排任务的执行,以便于 Quartz 任务调度器可以根据新的时间规则...

    quartz动态定时调度完整代码

    在实际应用中,Quartz的动态调度功能意味着你可以根据程序运行时的条件改变任务的执行计划。例如,你可以根据业务需求在运行时新增、修改或删除Trigger,以实现灵活的任务调度。结合Spring框架,Quartz还能与Spring...

    quartz3种调度形式+传参.zip

    1. 单纯的Quartz调度 在不依赖任何框架的情况下,直接使用Quartz API进行任务调度。首先,你需要创建一个Job类,实现`org.quartz.Job`接口,并重写`execute(JobExecutionContext context)`方法。然后,定义Trigger...

    quartz定时调度完整实例

    Quartz是一款开源的作业调度框架,它为Java应用程序提供了强大的定时任务管理能力。在这个"quartz定时调度完整实例"中,我们将深入理解Quartz的工作原理和如何在项目中实际应用。 1. **Quartz简介** - Quartz是...

    quartz 时间调度器的使用

    根据需要定义 Trigger,如设置触发时间、重复频率等。例如,创建一个简单的触发器: ```java Date startTime = new Date(); SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() ....

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

    本项目主要探讨如何在运行时动态修改Quartz定时任务的CronExpression,即cron表达式,来改变任务的执行时间。 首先,CronExpression是Quartz中用于定义时间触发规则的关键组件,它基于Unix的crontab语法,可以精确...

    Quartz调度、终止执行的任务

    Quartz是一款开源的作业调度框架,它允许开发者创建和安排任务执行。在Java应用程序中,Quartz能够帮助我们在特定的时间点或按照预设的周期执行某些功能,如数据收集、日志清理等。当我们需要终止某个正在运行的任务...

    Spring Quartz 调度器

    在这个bean中,我们可以设置Quartz的相关属性,如Job存储方式、线程池大小等。 ```xml <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> ...

    quartz 定时任务调度

    Quartz 是一个开源的作业调度框架,用于在 Java 应用程序中实现复杂的时间调度任务。它允许开发者定义定时任务,这些任务会在指定的时间点自动执行。Quartz 提供了一套丰富的 API 和支持,可以方便地与 Spring 框架...

    quartz实现动态任务定时调度

    Quartz 是一个开源的作业调度框架,用于在 Java 应用程序中实现复杂的时间调度任务。它提供了丰富的 API,使得开发者能够轻松地定义、安排和管理任务。在本例中,我们将探讨如何利用 Quartz 实现动态任务定时调度,...

    Quartz任务调度器

    同时,Quartz提供了丰富的API和插件系统,可以进行更复杂的任务调度,如暂停、恢复、删除任务,以及动态修改任务执行策略等。 总的来说,Quartz任务调度器与Spring的整合使得我们能够在应用中轻松地实现定时任务的...

    quartz定时调度器动态修改时间不用配置文件

    这正是“quartz定时调度器动态修改时间不用配置文件”这一主题的核心内容。 首先,理解Quartz的基本概念是很重要的。Quartz通过Job(任务)和Trigger(触发器)两个核心组件来实现任务调度。Job是实际要执行的任务...

    Quartz.net作业调度自定义定时执行任务多任务执行c#

    5. **动态调度**: 除了静态配置任务外,Quartz.NET还支持动态调度。例如,你可以在程序运行时根据需要添加、修改或删除Job和Trigger。 6. **持久化**: 为了保证任务的可靠性和在服务器重启后的恢复,Quartz.NET支持...

    Quartz.Net任务调度

    Quartz.Net是一个强大的任务调度框架,它在.NET环境中被广泛应用,尤其在需要执行定时任务的系统中。Quartz.Net的设计灵感来源于Java的Quartz库,它允许开发者灵活地定义和管理作业(Jobs)以及触发器(Triggers),...

    spring+quartz动态设置定时时间

    本篇文章将深入探讨如何在Spring与Quartz结合的环境中动态设置定时时间。 首先,Spring框架提供了方便的依赖注入和AOP(面向切面编程)功能,使得集成其他库变得更加容易。Quartz是一个强大的作业调度框架,它可以...

    Quartz动态调度示例

    // 设置Quartz属性 factory.setJobDetails(quartzConfig.getJobDetails()); factory.setTriggers(quartzConfig.getTriggers()); return factory; } // ... } ``` 在上述代码中,`quartz.properties`文件用于...

    作业调度Quartz.net源代码

    Quartz.NET是一个开源的工作调度框架,它允许开发者在.NET环境中创建和执行计划任务。这个“作业调度Quartz.net源代码”文件很可能是包含了Quartz.NET的示例代码或者一个简单的项目,帮助用户理解和学习如何使用...

    .net Quartz 任务调度平台源码

    3. **调度执行**:Quartz.NET 提供了丰富的调度策略,如简单触发器、cron触发器等,可以根据需要设置任务的执行时间,如定时执行、间隔执行、周期执行等。 4. **访问权限控制**:该平台可能包含权限管理系统,允许...

    Spring集成Quartz调度框架.pdf

    ### Spring集成Quartz调度框架详解 #### 一、Quartz调度框架概述 Quartz是一个开源的、成熟的作业调度框架,其主要目标是在Java应用程序中提供简单而强大的作业调度能力。Quartz支持作业按时间间隔(如每天、每周...

Global site tag (gtag.js) - Google Analytics