[java]quartz开源任务调度框架

1.什么是quartz?
quartz百度百科
quartz是一种较为成熟的开源任务调度框架,大致有四部分组成Job,JobDetail,Triagger(触发),Schedule(调度)
思路就是 触发事件—>调度(核心)—>执行任务

2.java样例
导入pom依赖

  <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
    <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
    </dependency>
package com.dongshuo.test.cronjob;

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

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

/**
 * @author dongshuo
 * @data 2018/7/27 14:24
 * @Description quartz 由4大部分组成 job jobdetail schedule trigger(触发)
 */
public class QuartzJob implements Job{
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("QuartzJob start");
        //业务逻辑
        StringBuilder sb = new StringBuilder("任务开始执行啦" + Thread.currentThread().getName());
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sb.append(sdf.format(date));
        System.out.println(sb);
        System.out.println("QuartzJob end");
    }
}
package com.dongshuo.test.cronjob;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @author dongshuo
 * @data 2018/7/27 14:41
 * @Description
 */
public class QuarzSchedule {
    public static void main(String[] args) throws SchedulerException {
        //构造JobDetail 绑定业务逻辑QuartzJob.class
        JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).build();
        //创建一个Trigger触发器的实例,定义该job立即执行,并且每2秒执行一次,一直执行
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger").startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(2).repeatForever()).build();
        //每日的9点40触发任务
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("cronTrigger")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 40 9 * * ? ")).build();
        //创建schedule实例
        StdSchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail,trigger);
    }
}

以上内容实现了最简单的使用

3.结合Spring

<!-- 定义jobDetail -->
    <bean id ="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <!-- 指定具体的job类 -->
        <property name ="jobClass" value="com.zx.quartz.MyJob" />
        <!-- 指定job的名称 -->
        <property name="name" value="myJob" />
        <!-- 指定job的分组 -->
        <property name="group" value="jobs" />
        <!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务  -->
        <property name="durability" value="true"/>
        <!-- 指定spring容器的key,如果不设定那么在job类中是获取不到spring容器里的对象的  -->
        <property name="applicationContextJobDataKey" value="applicationContext"/>
    </bean>

    <!-- 另一种方式, 定义job和jobDetial, Job类为普通类即可
        <!-- 配置job --
        <bean id="myJob" class="com.zx.quartz.MyJob"/>
        <!-- 配置jobDetail --
        <bean id="myJobDetial" class="org.springframework.scheduling.quartz.MethodlnvokingJobDetaiLFactoryBean">
            <property name="targetObject">
                <ref bean="myJob" />
            </property>
            <property name="targetMethod">  <!-- 要执行的方法名 --
                <value>execute</value>
            </property>
        </bean>
     -->

    <!-- 定义触发器 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="myJobDetail" />
        <!-- 每五秒执行一次 -->
        <property name="cronExpression" value="0/5 * * * * ?" />
    </bean>

    <!-- 定义触发器, 一个job可以有多个trigger, 但一个trigger只能有一个job -->
    <bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="myJobDetail" />
        <!--  每一分钟执行一次 -->
        <property name="cronExpression" value="0 */1 * * * ?" />
    </bean>

    <!-- 定义调度器 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger" />
                <ref bean="cronTrigger2" />
            </list>
        </property>
    </bean>

4.

猜你喜欢

转载自blog.csdn.net/drdongshiye/article/details/81269724