Quartz 任务调度框架之Hello World

0x01 什么是Quartz?

Quartz是一个完全由java编写的开源作业调度框架。

0x02 实战Quartz Hello World

创建Maven项目,POM 文件配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xingyun</groupId>
    <artifactId>quartz.sample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Quartz Sample</name>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
        </dependency>
    </dependencies>


</project>

 创建一个定时需要执行的作业

HelloJob.java

import java.text.SimpleDateFormat;
import java.util.Date;

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

public class HelloJob implements Job{
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //打印当前的执行时间 例如 2017-11-23 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("现在的时间是:"+ sf.format(date));
        //具体的业务逻辑
        System.out.println("Hello Quartz");
    }
}

这个作业很简单,定时打印当前时间。

由于时间有关,因此我们需要一个工具类来做时间格式转化

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {
    /**
     * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
     * 
     * @param strDate
     * @return
     */
  public static Date strToDateLong(String strDate) {
     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     ParsePosition pos = new ParsePosition(0);
     Date strtodate = formatter.parse(strDate, pos);
     return strtodate;
  }
}

 

主方法调用

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class MainTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
        
            //创建一个jobDetail的实例,将该实例与HelloJob Class绑定
            JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build();
            //创建一个Trigger触发器的实例,定义该job立即执行,并且每2秒执行一次,一直执行
            SimpleTrigger trigger = TriggerBuilder.
                    newTrigger().
                    withIdentity("myTrigger").
                    startNow().
                    endAt(DateUtil.strToDateLong("2018-11-06 16:56:22")).
                    withSchedule(
                            SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(2).repeatForever()).build();
            //创建schedule实例
            StdSchedulerFactory factory = new StdSchedulerFactory();
            Scheduler scheduler = factory.getScheduler();
            scheduler.start();
            scheduler.scheduleJob(jobDetail,trigger);
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            System.out.println(e.toString());
        }
    }

}

 

值得注意的一点:

我们定时任务从

2018-11-06 16:55:22开始任务调度

当定时任务到

2018-11-06 16:56:22 之前停止任务调度

也就是说
endAt 的含义是 当执行到 2018-11-06 16:56:20 时发现到达我们设置的终点值,此时终止任务调度。

而不是恰好等于
2018-11-06 16:56:22

 打印结果:

 

posted @ 2018-11-06 17:01  技术宅星云  阅读(678)  评论(0编辑  收藏  举报