一,导包

1)官网下载:http://www.quartz-scheduler.org/downloads/
2)Maven

        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>

二,实例

1.先定义一个作业任务类,写我们的执行代码

package cn.zyzpp.quartz.demo;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.Trigger;
/**
 * Created by yster@foxmail.com
 * 2018年4月9日 下午11:00:52
*/
public class HelloJob implements Job {

    //第(2)种获取传入的参数的方法:setter方法 属性对应key的值
    private String setKey;

    public void execute(JobExecutionContext context) throws JobExecutionException {
        //获取JobDetail对象
        String now =  new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(new Date());
        JobDetail detail = context.getJobDetail();
        String group = detail.getKey().getGroup();
        String value = detail.getJobDataMap().getString("key");

        //获取Trigger对象
        Trigger trigger = context.getTrigger();
        value= trigger.getJobDataMap().getString("key");

        //获取JobDataMap对象
        //第(1)种获取传入的参数的方法
        JobDataMap data =  context.getMergedJobDataMap();
        value = data.getString("key");//相同key 调用trigger的value
        //System.out.println(group + ":" + value  + " at " + now + setKey);

        //获取Jobkey对象
        JobKey jobKey = trigger.getJobKey();
        String name =  jobKey.getName();
        group = jobKey.getGroup();

        try {
            Thread.sleep(5000l);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(now + ":" + name + " " +group);
    }

    public String getSetKey() {
        return setKey;
    }

    public void setSetKey(String setKey) {
        this.setKey = setKey;
    }

}

2.

package cn.zyzpp.quartz.demo;

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

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Created by yster@foxmail.com 2018年4月9日 下午10:57:14
 */
public class QuartzTest {

    public static void main(String[] args) {
        SimpleDateFormat sf =new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
        try {
            // Quartz 作业:定义一个JobDetail:为Job类设置属性
            JobDetail jobDetail = JobBuilder.newJob(HelloJob.class) // 定义Job类为HelloQuartz类,这是真正的执行逻辑所在
                    .withIdentity("job1", "group1") // 定义name/group
                    .usingJobData("key", "job-value") // 自定义参数
                    .usingJobData("setKey", "setValue").build();

            // System.out.println(jobDetail.getKey().getName());
            // System.out.println(jobDetail.getKey().getGroup());
            // System.out.println(jobDetail.getJobClass());

            // 定义任务开始时间以及结束时间
            Date startDate = new Date();
            System.out.println("scheduler开始:" + sf.format(new Date()));
            startDate.setTime(new Date().getTime() + 2000);
            Date endDate = new Date();
            endDate.setTime(startDate.getTime() + 4000);

            // Quartz触发器:定义一个Trigger
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger1", "group1") // 定义name/group
                    // .startNow()//一旦加入scheduler,立即生效
                    .startAt(startDate)
                    .endAt(endDate)
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(1) // 每隔一秒执行一次
                            .repeatForever()) // 一直执行,奔腾到老不停歇
                    .usingJobData("key", "trigger-value")
                    .build();

            //SimpleTrigger 在一个指定时间段内执行一次作业任务 或者在指定时间间隔内多次执行作业任务
            SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder
                    .newTrigger()
                    .withIdentity("trigger1", "group1") // 定义name/group
                    .startAt(startDate)
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(2)
                            .withRepeatCount(3))    //执行第1次后再执行3次(SimpleTrigger.REPEAT_INDEFINITELY)
                    .build();

            //CronTrigger 基于 cron 表达式,更常用
            CronTrigger cronTrigger = (CronTrigger) TriggerBuilder
                    .newTrigger()
                    .withIdentity("trigger1", "group1") // 定义name/group
                    .startAt(startDate)
                    .withSchedule(
                            //Cron表达式:[秒][分][时][日][月][周][年] (周日1-周六7,年可不写)   *每 ?不关心 -至 #第 /递增 ,和 L最后 W最近工作日
                            CronScheduleBuilder.cronSchedule("0/2 * * * * ? * ")
                            )
                    .build();

            // 调度类链接“工作”和“触发器”到一起,并执行它
            // 创建scheduler
            StdSchedulerFactory sfact = new StdSchedulerFactory();
            Scheduler scheduler = sfact.getScheduler();

            // 加入这个调度 返回第一次执行时间
            scheduler.scheduleJob(jobDetail, cronTrigger);
            //System.out.println("调度器:" + sf.format(scheduler.scheduleJob(jobDetail, cronTrigger)));

            // 启动之
            scheduler.start();

            // 运行一段时间后暂停    可再次start 当前主线程不终止
            Thread.sleep(10000l);
//          scheduler.standby();
//          System.out.println("暂停:三秒后再次开启");

//          Thread.sleep(3000l);
//          scheduler.start();

//          Thread.sleep(5000l);
            scheduler.shutdown(true);//true等待执行的job完成后关闭scheduler,false直接关闭
            System.out.println("scheduler终止" + sf.format(new Date()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三,干货

1)Cron表达式



2)/org/quartz/quartz.properties




3)集成Spring

   <!-- JobDetail -->
    <!-- (1)simpleJobDetail : 定义任务类和任务方法-->
    <bean id="simpleJobDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="myBean" />
        <property name="targetMethod" value="printMessage" />
    </bean>

    <!--(2)继承 QuartzJobBean 传参-->
    <bean id="firstComplexJobDetail"
        class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass"
            value="com.imooc.springquartz.quartz.FirstScheduledJob" />
        <property name="jobDataMap">
            <map>
                <entry key="anotherBean" value-ref="anotherBean" />
            </map>
        </property>
        <property name="durability" value="true"/>
    </bean>

    <!--Trigger-->
    <!-- (1)距离当前时间1秒之后执行,之后每隔两秒钟执行一次 -->
    <bean id="mySimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail"  ref="simpleJobDetail"/>
        <property name="startDelay"  value="1000"/>
        <property name="repeatInterval"  value="2000"/>
    </bean>

    <!-- (2)每隔5秒钟执行一次 -->
    <bean id="myCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail"  ref="firstComplexJobDetail"/>
        <property name="cronExpression"  value="0/5 * * ? * *"/>
    </bean>

    <!-- (3)Scheduler -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="simpleJobDetail"/>
                <ref bean="firstComplexJobDetail"/>
            </list>
        </property>
        <property name="triggers">
            <list>
                <ref bean="mySimpleTrigger"/>
                <ref bean="myCronTrigger"/>
            </list>
        </property>
    </bean>

1.MyBean.java

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

import org.springframework.stereotype.Component;

@Component("myBean")
public class MyBean {
    public void printMessage() {
        // 打印当前的执行时间,格式为2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("MyBean Executes!" + sf.format(date));
    }
}

2.AnotherBean.java


import org.springframework.stereotype.Component;

@Component("anotherBean")
public class AnotherBean {
    public void printAnotherMessage() {
        System.out.println("AnotherMessage");
    }
}

3.FirstScheduledJob.java

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

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class FirstScheduledJob extends QuartzJobBean{
     private AnotherBean anotherBean;

     public void setAnotherBean(AnotherBean anotherBean){
         this.anotherBean = anotherBean;
     }

    @Override
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("FirstScheduledJob Executes!" + sf.format(date));
        this.anotherBean.printAnotherMessage();
    }
}

任务调度工具Quartz入门笔记的更多相关文章

  1. Java任务调度框架Quartz入门

    Quartz[kwɔːts]:石英,其框架和名字一样简单朴素又不失魅力,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框 ...

  2. 最牛逼的任务调度工具 | Quartz

    Quartz 是一个完全由 Java 编写的开源作业调度框架,不要让作业调度这个术语吓着你,其实不难.尽管 Quartz 框架整合了许多额外功能,但就我们使用来说,你会发现它易用得简直让人受不了! 简 ...

  3. (转)Java任务调度框架Quartz入门教程指南(三)任务调度框架Quartz实例详解深入理解Scheduler,Job,Trigger,JobDetail

    http://blog.csdn.net/zixiao217/article/details/53053598 首先给一个简明扼要的理解: Scheduler 调度程序-任务执行计划表,只有安排进执行 ...

  4. (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务

    http://blog.csdn.net/zixiao217/article/details/53044890 读完第一节,我们已经对Quartz有了一个大体的认识,它可以定时帮我们执行一些处理程序, ...

  5. (转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例

    http://blog.csdn.net/zixiao217/article/details/53075009 Quartz的主要接口类是Schedule.Job.Trigger,而触发器Trigge ...

  6. 嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度

    嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度 上一篇笔记介绍了一些绕开排程器(或调度程序,scheduler)来进行时间管理的一些小方法.这一篇详细介绍RTX的任务调度原理. RTX主要有 ...

  7. golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布

    本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...

  8. golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

    micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  9. golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

    micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.s ...

随机推荐

  1. (后端)JackSon将java对象转换为JSON字符串(转)

    转载小金金金丶园友: JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的 ...

  2. Kotlin 或将取代 Java——《Java 编程思想》作者 Bruce Eckel [转]

    Bruce Eckel 是<Java 编程思想>.<C++编程思想>的作者,同时也是 MindView 公司的总裁,该公司向客户提供软件咨询和培训.他是 C++ 标准委员会拥有 ...

  3. Apache Linux下Apache安装步骤

    Apache简介         Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广 ...

  4. Python中类的定义及使用

    类是一些有共同特征和行为事务事物的抽象概念的总和. 从中可以看出,方法只能使用实例直接调用(无需传self参数),而使用类调用必须传入实例对象: 属性可以使用实例调用,也可以使用类直接调用,因此可以看 ...

  5. MyBatis笔记----报错Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ij34.model.UserMapper.selectUser

    信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@41cf53f9: startup ...

  6. The JSP specification requires that an attribute name is

    把另一个博客内容迁移到这里 七月 10, 2016 10:23:12 上午 org.apache.catalina.core.ApplicationDispatcher invoke 严重: Serv ...

  7. Spring MVC 全注解配置 (十一)

    完整的项目案例: springmvc.zip 目录 实例 项目结构: 父级的pom配置: <?xml version="1.0" encoding="UTF-8&q ...

  8. NPOI 笔记

    前言 文档:http://npoi.codeplex.com/documentation 示例:https://npoi.svn.codeplex.com/svn/ 下载:https://www.nu ...

  9. DELL 服务器报CPU 1 has an internal error (IERR)

    重启服务器,然后按F2 进入到bios中,选择system bios settings这个选项,然后选择system profiles 进入,在这个里面麻烦将 C1E 和Cstate这两个选项改为di ...

  10. python爬虫之12306网站--火车票信息查询

    python爬虫之12306网站--火车票信息查询 思路: 1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息 ...