Java定时器和Quartz

一、前言

最近在写项目的时候用到了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>
    
    <bean id="mailJob" class="com.lw.jk.job.MailJob">bean>
    
    <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总结就这样了。

你可能感兴趣的:(JavaEE)