Java定时器和Quartz

时间:2021-08-09 00:07:30

一、前言

最近在写项目的时候用到了Quartz,于是准备总结一下。不过在总结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();
}

}
}

步骤:

  1. 创建job
  2. 创建工厂,获取调度器
  3. 使用JobBuilder通过job生成jobDetail,可以传递数据
  4. 通过TriggerBuilder创建Trigger,可以设置时间
  5. 通过调度器注册ob和trigger
  6. 启动调度

五、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总结就这样了。