一、前言
Quartz与原生的定时器之间的区别,不懂的请自行百度
二、自定义定时器
在学习一个框架之前,喜欢先想想我有没有能力实现一个简单的类似功能,定时器还是比较简单,可以一试。
/** * 自定义一个定时器 * @author lw */ public class MyTimer extends Thread{ private Long time ; public MyTimer(Long time) { this.time = time; } @Override public void run() { while(true){ try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } send(); } } /** * 开始执行任务 */ public void execute(){ this.start(); } /** * 定时任务 */ private void send() { System.out.println("任务执行了:" + new Date()); } public static void main(String[] args) { MyTimer myTimer = new MyTimer(2000L) ; myTimer.execute(); } }
输出如:
任务执行了:Sat Apr 15 15:56:52 CST 2017 任务执行了:Sat Apr 15 15:56:54 CST 2017 任务执行了:Sat Apr 15 15:56:56 CST 2017 任务执行了:Sat Apr 15 15:56:58 CST 2017 任务执行了:Sat Apr 15 15:57:00 CST 2017
当然功能很简单,但是起码也学到了点东西。
三、Timer
要知道这么常用的功能,我都可以实现(比较菜的),Java肯定已经帮我们实现了,那就是Timer类了。
public class TimerTest { public static void main(String[] args) { Timer timer = new Timer(); // 5s后执行 // timer.schedule(new MyTask(), 5000); // 马上执行任务,每隔1000执行一次 timer.scheduleAtFixedRate(new MyTask(), new Date(), 1000); } } // 定时任务,这是一个线程 class MyTask extends TimerTask { @Override public void run() { System.out.println("task execute "); } }
查看TimerTask源码
public abstract class TimerTask implements Runnable { ... }
由上面可以知道,Timer也是基于线程来实现的。当然它实现的也更复杂点。
四、Quartz框架
Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。
使用如下:
创建job
public class HelloJob implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { JobDetail detail = context.getJobDetail(); String name = detail.getJobDataMap().getString("name"); System.out.println("say hello " + name ); } }
测试
public class QuartzTest { public static void main(String[] args) throws InterruptedException { // 创建工厂 SchedulerFactory schedulerfactory = new StdSchedulerFactory(); Scheduler scheduler = null; try { // 通过schedulerFactory获取一个调度器 scheduler = schedulerfactory.getScheduler(); // 指明job的名称,所在组的名称,以及绑定job类 JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("JobName", "JobGroupName") .usingJobData("name", "quartz").build(); // 定义触发的条件 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("CronTrigger1", "CronTriggerGroup") .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever()) .startNow().build(); // 把作业和触发器注册到任务调度中 scheduler.scheduleJob(job, trigger); // 启动调度 scheduler.start(); Thread.sleep(10000); // 停止调度 scheduler.shutdown(); } catch (SchedulerException e) { e.printStackTrace(); } } }
步骤:
- 创建job
- 创建工厂,获取调度器
- 使用JobBuilder通过job生成jobDetail,可以传递数据
- 通过TriggerBuilder创建Trigger,可以设置时间
- 通过调度器注册ob和trigger
- 启动调度
五、Quartz和Spring整合
创建job
public class MailJob { private void send() { System.out.println("发送邮件了:" + new Date()); } }
配置
<description>Quartz配置文件</description> <!-- 定义一个job --> <bean id="mailJob" class="com.lw.jk.job.MailJob"></bean> <!-- 定义一个 MethodInvokingJobDetailFactoryBean--> <bean id="methodInvokingJobDetailFactoryBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="mailJob"></property> <property name="targetMethod" value="send"></property> </bean> <!-- 指定时间 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="methodInvokingJobDetailFactoryBean"></property> <property name="cronExpression" value="0/10 * * * * ? *"></property> </bean> <!-- 指定调度器 --> <bean id="schedule" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean>
输出如下:
发送邮件了:Sat Apr 15 16:12:00 CST 2017 发送邮件了:Sat Apr 15 16:12:10 CST 2017
OK,这篇学习定时器和Quart总结就这样了。