Quartz框架

简介

Quartz:定时任务

Quartz :定时异步任务

Quartz官网

概念

任务:做什么事情…. StudentService

触发器:定义时间

调度器:将任务、触发器 一一对应】

实现步骤:(独立使用)

jar

jar 在quartz-2.2.1-distribution的lib中

编写

任务

public class MeetingService {
    public void calClassMeeting(){
        System.out.println("需要提醒的任务(召开会议....)");
//        try {
//            Thread.sleep(5000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        System.out.println("end.....");
    }
}

Job


public class PlanJob implements Job {
    MeetingService meetingService = new MeetingService();
    //jobExecutionContext可以获取 设置的各种参数值
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        TriggerKey triggerkey =
                jobExecutionContext.getTrigger().getKey();
        JobKey jobKey = jobExecutionContext.getJobDetail().getKey();
        System.out.println("----");
        System.out.println(triggerkey+"\n"+jobKey);
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        List<String> infos = (List<String>)jobDataMap.get("infos");
        System.out.println(infos);

        //存放 计划执行的任务...
        meetingService.calClassMeeting();
    }
}

3.测试方法:Job 、 触发器 、调度器


public class TestQuartz {
//XxxBuilder ->withIdentity()-->Xxx
    public static void main(String[] args) throws SchedulerException, InterruptedException, ParseException {
//        PlanJob
        JobBuilder jobBuilder = JobBuilder.newJob(PlanJob.class);//PlanJob PlanJob PlanJob
        //产生实际使用的Job
        JobDetail jobDetail = jobBuilder.withIdentity("meeting Job", "group1").build();

        //向Job的execute()中传入一些参数。。。
//        JobDatMap
        JobDataMap jobDataMap = jobDetail.getJobDataMap();
        List<String> names = Arrays.asList(new String[]{"zs","ls","ww"});
        jobDataMap.put("infos",names);

        // 触发器(Trigger):时间规则  ,依赖2个对象(TriggerBuilder ,Scheduel)
        TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
        triggerBuilder = triggerBuilder.withIdentity("meeting trigger", "group1");
        triggerBuilder.startNow();//当满足条件时  立刻执行
        // 2019-03-13 09:46:30   --  // 2019-03-13 09:46:45
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date start = sdf.parse("2019-03-13 09:46:30");
        Date end = sdf.parse("2019-03-13 09:46:45");
//        triggerBuilder.startAt(start);
//        triggerBuilder.endAt(end);

        //scheduelBuilder:定执行的周期(时机)
//        SimpleScheduleBuilder scheduelBuilder = SimpleScheduleBuilder.simpleSchedule();
//        scheduelBuilder.withIntervalInSeconds(1) ;//每隔1秒执行一次
//        scheduelBuilder.withRepeatCount(300) ;//重复执行3次
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("5,10,15,30,45 * * * * ? *");
        //产生触发器
        CronTrigger trigger = triggerBuilder.withSchedule(cronScheduleBuilder).build();
//        调度器(工厂产生调度器)
         SchedulerFactory secheduleFacotry = new StdSchedulerFactory();
        //产生调度器
        Scheduler scheduler = secheduleFacotry.getScheduler();
        //通过调度器 将 任务 和 触发器一一对应
        scheduler.scheduleJob(jobDetail,trigger) ;
        scheduler.start();
//        scheduler.shutdown(true);
    }
}
scheduler.shutdown():立刻关闭
scheduler.shutdown(false):shutdown()立刻关闭
scheduler.shutdown(true):将当前任务执行完毕后 再关闭

异步任务

触发器:CronScheduleBuilder

Cron表达式:

6-7个个参数,以空格隔开

秒   分   时   天(月)    月   天(周)     (年)

Cron表达式元素含义

特殊字符含义

Cron表达式示例

源码git地址

Spring整合Quartz

jar

spring基础包(spring-context-support.jar/spring-tx.jar)+quartz

编写

将Job信息封装到一个 实体类中

public class ScheduleJob {
    //id
    private String jobId ;
    private String jobName  ;
    private String jobGroup ;
    private String jobStatus ;//0:禁用  1启用  2删除
    private String cronExpression ;
    private String desc ;
    public String getJobId() {
        return jobId;
    }
    public void setJobId(String jobId) {
        this.jobId = jobId;
    }
    public String getJobName() {
        return jobName;
    }
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }
    public String getJobGroup() {
        return jobGroup;
    }
    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }
    public String getJobStatus() {
        return jobStatus;
    }
    public void setJobStatus(String jobStatus) {
        this.jobStatus = jobStatus;
    }
    public String getCronExpression() {
        return cronExpression;
    }
    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
}

spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="scheduleJobEntity" class="com.yanqun.entity.ScheduleJob"  >
            <property name="jobId" value="j001"></property>
            <property name="jobName" value="任务1"></property>
            <property name="jobGroup" value="任务组1"></property>
            <property name="jobStatus" value="1"></property>
            <property name="cronExpression" value="5,10,30,50 * * * * ? *"></property>
            <property name="desc" value="描述..."></property>
    </bean>
        <bean  id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean" >
            <property name="jobClass" value="com.yanqun.job.PlanJob">
            </property>

            <property name="jobDataAsMap">
                    <map>
                        <entry key="scheduleJob">
                            <ref bean="scheduleJobEntity"></ref>
                        </entry>
                    </map>

            </property>
        </bean>
     <!-- 触发器:定义时间规则
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

        <property name="jobDetail" ref="jobDetail" >
        </property>
        <property name="cronExpression" value="#{scheduleJobEntity.cronExpression}">
        </property>

    </bean>
    -->
    <!--SimpleTrigger-->
    <bean  id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"  >
            <property name="repeatInterval" value="2000"></property>
            <property name="repeatCount" value="10"></property>
            <property name="startDelay" value="3"></property>
        <property name="jobDetail" ref="jobDetail" >
        </property>
    </bean>
      <bean id="schedulerFactoryBean"  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                        <ref bean="simpleTrigger" />
                </list>
            </property>
      </bean>
</beans>

要做的事情

public class PlanJob  implements Job {
    private MeetingService  meetingService = new MeetingService() ;
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        meetingService.remindMeeting(); ;
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        ScheduleJob job =  (ScheduleJob)jobDataMap.get("scheduleJob");
        System.out.println(job.getJobId());
        System.out.println(job.getJobName());
    }
}

测试

public class TestQuartzSpring {
    public static void main(String[] args) throws SchedulerException {
        //singleton:容器初始化时
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//        StdScheduler scheduler = (StdScheduler)context.getBean("schedulerFactoryBean");
//        scheduler.start();SchedulerFactoryBean默认会在实例化时自动启动(singleton的bean会会在ioc容器初始化时 自动加载)
    }
}

调度器 ->触发器(Job、执行时间)

源码