quartz定时任务简介及简单使用

Quartz简单使用

一、quartz简单介绍

1.1 quartz是什么?
是一个完全由Java编写的开源的作业调度框架
1.2 quartz的主要用途

它主要是指定在某个时间去执行相应的任务的

比如:你买东西是下了单,在指定的时间内没有支付订单,那么就会执行任务将你的订单取消

二、Quartz的使用

1.1 常用的API

1.Job接口

1.这是一个定时功能的接口,称之为任务(job),我们需要实现此接口
2.Job的实现类主要有:SendMailJob/SendMessage/其他自定义的Job实现类

2.Trigger触发器

1.有了任务之后,需要一个触发器触发任务去执行,触发器Trigger最基本的功能   是指定Job的执行时间,执行间隔,运行次数等
2.实现类:SimpleTrigger/其他自定义的Trigger实现类

3.Scheduler调度器

调度器主要负责指定Trigger去执行指定的job任务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vk1FJ4hP-1596108674692)(upload\image-20200730185900848.png)]

上图是Quartz的基本组成部分,及其三者之间的关系
1.2 使用方法
1.2.1 添加依赖
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>
1.2.2 简单的代码实现

1.自定义一个任务

public class HelloQuartz implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("任务被执行了,===="+sdf.format(new Date()));
    }
}

2.启动任务,设置每5秒执行一次

 public static void main(String[] args) throws SchedulerException {
        //创建自定义的任务(job)对象
        JobDetail build = JobBuilder.newJob(HelloQuartz.class).build();
        //创建触发器(trigger)对象,并且设置触发规则,多少时间执行一次job
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)).build();
        //创建任务调度对象
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        //4.将任务和触发器联系到一起
        scheduler.scheduleJob(build, trigger);
        //5.启动任务
        scheduler.start();
    }

执行结果
在这里插入图片描述

1.2.3 核心的对象介绍
  • JobDetail

    主要指定了Job的更加详细的属性,如任务名称和任务群组...
    
  • Trigger

    一个用于描述触发Job执行的时间规则的类
    
  • SimpleTrigger

    一次或者固定时间间隔周期的触发规则
    
  • CronTrigger

    通过cron表达式描述出更为复杂的触发规则
    
  • Scheduler

    1. 代表一个Quartz的独立运行容器
    2. Trigger和JobDetail被注册到Scheduler中
    3. 二者在Scheduler中拥有各自的名称(name)和组名(group)
    4. Trigger和JobDetail的名称和组名的组合必须唯一,但是Trigger的名称和组名的组合可以和JobDetail的相同,因为它们类型不同
    5. 一个Job可以绑定多个Trigger
    
  • Calendar

    Quartz提供的日历类,一个Trigger可以和多个Calendar关联,以此来排除一些特殊的日期
    
  • 代码实现

    配置文件

    <?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">
            <!--首先将自定义任务类加入到IOC容器-->
            <bean id="myJob" class="com.qf.quartz.MyJob"></bean>
            <!--配置固定时长的任务类,并注入被任务调度类和任务方法-->
            <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
                <!--注册被调度类-->
                <property name="targetObject" ref="myJob"></property>
                <!--注册被调度方法-->
                <property name="targetMethod" value="task1"></property>
                <!--设置名称-->
                <property name="name" value="task1"></property>
                <!--设置分组-->
                <property name="group" value="group"></property>
            </bean>
            <!--配置cron表达式的任务类,并且注入被任务调度类和任务方法-->
            <bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
                <!--注册被调度类-->
                <property name="targetObject" ref="myJob"/>
                <!--注册被调度方法-->
                <property name="targetMethod" value="task2"/>
                <!--设置名称-->
                <property name="name" value="task2"></property>
                <!--设置分组-->
                <property name="group" value="group"></property>
            </bean>
            <!--配置固定时长的触发器并且配置任务的时间-->
            <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
                <!--配置此触发器作用的类型-->
                <property name="jobDetail" ref="jobDetail"/>
                <!--指定触发器执行的间隔-->
                <property name="repeatInterval" value="1000"/>
            </bean>
            <!--配置cron表达式的触发器并配置任务的规则-->
            <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
                <!--配置此触发器作用的类型-->
                <property name="jobDetail" ref="jobDetail2"/>
                <!--指定触发器执行的间隔-->
                <property name="cronExpression" value="0/1 * * * * ?"/>
            </bean>
            <!--配置调度-->
            <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
                <property name="triggers">
                   <list>
                       <ref bean="simpleTrigger"/>
                       <ref bean="cronTrigger"/>
                   </list>
                </property>
            </bean>
    </beans>
    

    自定义任务类

    public class HelloQuartz2 implements Job {
        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println("任务被执行了,===="+sdf.format(new Date()));
        }
    }
    

    测试

    public static void main(String[] args) throws SchedulerException {
            //创建自定义的任务(job)对象
            JobDetail build = JobBuilder.newJob(HelloQuartz2.class).build();
            //创建触发器(trigger)对象,并且设置触发规则,多少时间执行一次job
    
            Date startTime = new Date();//开始执行时间
            startTime.setTime(startTime.getTime()+2000);//设置在两秒后执行
            Date endTime = new Date();
            endTime.setTime(endTime.getTime()+5000);//结束时间推迟5秒
            SimpleTrigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger1", "triggerGroup1")
                    .startNow()//设置立即生效时间
                    .startAt(startTime)//触发器开始时间
                    .endAt(endTime)//触发器结束时间
                    .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1))
                    .build();
            //创建任务调度对象
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            //4.将任务和触发器联系到一起
            scheduler.scheduleJob(build, trigger);
            //5.启动任务
            scheduler.start();
        }
    

    运行结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值