• 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

     打印结果:

  • 相关阅读:
    2018.8.5 复习笔记
    C#抽象类与接口的区别【转】
    double转整数问题
    C++学习笔记
    BCG使用
    C++设计模式之工厂方法模式
    静态成员函数
    CTreeCtrl 控件使用总结
    WinAPI: ShellExecute
    C++ STL map使用
  • 原文地址:https://www.cnblogs.com/xingyunblog/p/9916374.html
Copyright © 2020-2023  润新知