`

Java 定时任务及作业调度 Quartz与Timer

阅读更多

相于Quartz的简介可以去网上查查,Timer是JDK中提供的,它们俩个都可以用来做:定时任务,作业调度

最近一个项目要用到这个,所以在网上花了一点时间搜集一下资料。我这里只能做为入门练习,深入的学习要在项目锻炼。

一、Quartz

1.开发作业,要继承org.quartz.Job

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;

/**
 * 作业
 * 
 * @author mingxue.zhang@163.com 2012-4-8
 */
public class SimpleJob implements Job {

	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		System.out.println("作业开始:exec...");
		JobKey jobKey = context.getJobDetail().getKey();
		System.out.println(jobKey);
	}
}

 

2.调度

import org.quartz.*;

public class Dispatch {
	public static void main(String[] args) throws Exception {
		// 调度作业
		JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1",
				"group1").build();
		// 定时器
		Date runTime = new Date();
		// Date runTime = DateBuilder.nextGivenSecondDate(null, 15);// 启动后15秒运行
		
		// 简单的定时器
		//Trigger trigger = null;
		/*
		trigger = TriggerBuilder.newTrigger()
				.withIdentity("trigger1", "group1").startAt(runTime).build();
		*/
		// 反复执行(5次),指向执行完间隔时间(10秒)
		/*
		trigger = TriggerBuilder.newTrigger()
				.withIdentity("trigger1", "group1").startAt(runTime)
				.withSchedule(
						SimpleScheduleBuilder.simpleSchedule()
								.withIntervalInSeconds(10).withRepeatCount(5))
				.build();
		*/
		//使用cron表达式
		CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(
				"trigger1", "group1").withSchedule(
				CronScheduleBuilder.cronSchedule("0/20 * * * * ?")).build();

		SchedulerFactory sf = new StdSchedulerFactory();
		// Scheduler 调度器 四种状态: stand-by, start, pause, shutdown
		Scheduler sched = sf.getScheduler();
		// 调度器绑定Job 和 Trigger
		Date jobRuningTime = sched.scheduleJob(job, trigger);// 返回Job运行的时间
		System.out.println(new SimpleDateFormat("hh:mm:ss").format(jobRuningTime));
		// 开始调度
		sched.start();

		// sched.shutdown(true);
	}
}

 

3.cron表达式

字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /

“*”字符被用来指定所有的值。如:"*"在分钟的字段域里表示“每分钟”。
“?”字符只在日期域和星期域中使用。它被用来指定“非明确的值”。当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。看下面的例子你就会明白。
月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号来表明不想设置那个字段。

“-”字符被用来指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”。

“,”字符被用来指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”。

“/”字符用于指定增量。如:“0/15”在秒域意思是每分钟的0,15,30和45秒。“5/15”在分钟域表示每小时的5,20,35和50。符号“*”在“/”前面(如:*/10)等价于0在“/”前面(如:0/10)。记住一条本质:表达式的每个数值域都是一个有最大值和最小值的集合,如:秒域和分钟域的集合是0-59,日期域是1-31,月份域是1-12。字符“/”可以帮助你在每个字符域中取相应的数值。如:“7/6”在月份域的时候只有当7月的时候才会触发,并不是表示每个6月。

详细用法请见附件

 

二、Timer

1.作业,要继承java.util.TimerTask

/**
 * 作业
 * 
 * @author mingxue.zhang@163.com 2012-4-8
 */
public class TimerTaskJob extends TimerTask {
	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	@Override
	public void run() {
		System.out.println("---===+"
				+ sdf.format(Calendar.getInstance().getTime()));
	}
}

2.调度

import java.util.Timer;

public class Dispatch {
	public static void main(String[] args) {
		TimerTaskJob job = new TimerTaskJob();
		Timer timer = new Timer();
		// true 说明这个timer以daemon方式运行(优先级低, 程序结束timer也自动结束)只会执行一次
		//timer = new Timer(true);
		timer.schedule(job, 1000, 2000);
		// 几个重载的方法
		// 以指定时间运行
		// 1 timer.schedule(task, time);
		// firstTime为Date类型,period为long 从firstTime时刻开始,每隔period毫秒执行一次。
		// 2 timer.schedule(task, firstTime, period);
		// delay 为long类型:从现在起过delay毫秒执行一次
		// 3 timer.schedule(task, delay)
		// delay为long,period为long:从现在起过delay毫秒以后,每隔period
		// 4 timer.schedule(task, delay, period)
	}
}

 

相于Quartz的高级用法可见附件中的官方提供的例子!!!

  • Quartz.rar (1.4 MB)
  • 描述: 例子源码
  • 下载次数: 167
分享到:
评论
1 楼 ztiany 2015-01-12  

相关推荐

    任务调度开源框架Quartz动态添加、修改和删除定时任务

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听...

    Spring Boot中的@Scheduled注解:定时任务的原理与实现

    这个注解主要基于Java的内置Timer类以及Quartz等定时任务库,但在Spring Boot中,它提供了更加简洁和易用的方式来实现定时任务。 # 实现原理 @Scheduled注解的实现原理主要依赖于Spring框架的任务调度机制。当...

    关于quartz的demo

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能: 持久性作业 - 就是保持调度定时的...

    Spring集成Quartz定时任务框架介绍.docx

    我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但时调度控制非常不方便,并且我们需要大量的代码。 使用Quartz框架无疑是非常好的选择,并且与Spring可以非常方便的集成,下面介绍它们集成...

    java8源码-learn-demo:平时学习的小例子

    学习java定时任务调度工具Timer demo-03-quartz 学习定时任务调度工具详解quartz demo-04-springboot SpringBoot入门 demo-05-spring-annotation spring中常用注解 demo-06-java8 java8的一些新特性 demo-07-netty-...

    timer:分布式任务调度框架,RPC通信,心跳检测,服务注册,服务发下,自动摘除,负载均衡策略

    目前业务系中定时任务采用quartz,定时任务散落在各个业务模块中,为了统一管理我们系统中灵活定时任务的需求,我们需要一套可控的定时任务系统,以便于我们系统未来的产品化。 1.2专用名词解释 executor:代指...

    Spring 2.0 开发参考手册

    3.3.3. bean属性及构造器参数详解 3.3.4. 使用depends-on 3.3.5. 延迟初始化bean 3.3.6. 自动装配(autowire)协作者 3.3.7. 依赖检查 3.3.8. 方法注入 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.3.3. bean属性及构造器参数详解 3.3.3.1. 直接量(基本类型、Strings类型等。) 3.3.3.2. 引用其它的bean(协作者) 3.3.3.3. 内部bean 3.3.3.4. 集合 3.3.3.5. Nulls 3.3.3.6. XML-based configuration metadata ...

    spring chm文档

    3.3.3. bean属性及构造器参数详解 3.3.4. 使用depends-on 3.3.5. 延迟初始化bean 3.3.6. 自动装配(autowire)协作者 3.3.7. 依赖检查 3.3.8. 方法注入 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. ...

    Spring中文帮助文档

    2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1...

    Spring API

    2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1....

Global site tag (gtag.js) - Google Analytics