zoukankan      html  css  js  c++  java
  • Quartz 实现定时器的功能

    Quartz简介
              SpirngBoot可以使用Quartz实现定时器的功能。Quartz定时器作用很多,比如定时发送信息、定时生成报表等。
              Quartz框架主要核心组件包括调度器、触发器、作业。调度器作为作业的总指挥,触发
    器作为作业的操作者,作业为应用的功能模块,组件关系如图

    Job 表示一个任务(工作),要执行的具体内容。 
    JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要 执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。 告诉调度容器,将来执行哪个类(job)的哪个方法。
    Trigger 是一个类,代表一个调度参数的配置,描述触发 Job 执行的时间触发规则。 一个 Job 可以对应多个 Trigger,但一个 Trigger 只能对应一个 Job  
    Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。 Scheduler 可以将 Trigger 绑定到某一 JobDetail 中,这样当 Trigger 触发时,对应的 Job 就被 执行。
        当 JobDetail 和 Trigger 在 scheduler 容器上注册后,形成了装配好的作业(JobDetail 和 Trigger 所组成的一对儿),就可以伴随容器启动而调度执行了。
    <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.time</groupId>
        <artifactId>TimeTask</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.0.RELEASE</version>
            <relativePath /> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <!-- 声明项目配置依赖编码格式为 utf-8 -->
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <fastjson.version>1.2.24</fastjson.version>
        </properties>
    
        <dependencies>
            <!--定时器依赖 -->
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>2.2.1</version><!--$NO-MVN-MAN-VER$-->
            </dependency>
            <!-- 该依赖必加,里面有sping对schedule的支持 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
            </dependency>
            <!--必须添加,要不然会出错,项目无法启动 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
            </dependency>
            
            <!--devtools热部署 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
                <scope>true</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    package com.tszr.time.job;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.stereotype.Component;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @Configuration
    @Component
    @EnableScheduling
    public class JobTask {
        public void start() throws InterruptedException {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.err.println("定时任务开始执行。" + format.format(new Date()));
    
        }
    }
    package com.tszr.time.job;
    
    import org.quartz.Trigger;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
    import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
    import org.springframework.scheduling.quartz.SchedulerFactoryBean;
    
    import com.tszr.time.job.JobTask;
    
    @Configuration
    public class QuartzConfigration {
        @Bean(name = "jobDetail")
        public MethodInvokingJobDetailFactoryBean detailFactoryBean(JobTask task) {
            // ScheduleTask为需要执行的任务
            MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
            /*
             * 是否并发执行 例如每3s执行一次任务,但是当前任务还没有执行完,就已经过了3s了.
             * 如果此处为true,则下一个任务会bing执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
             */
            jobDetail.setConcurrent(true);
            jobDetail.setName("scheduler");// 设置任务的名字
            jobDetail.setGroup("scheduler_group");// 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用
    
            /*
             * 这两行代码表示执行task对象中的scheduleTest方法。定时执行的逻辑都在scheduleTest。
             */
            jobDetail.setTargetObject(task);
            jobDetail.setTargetMethod("start");
            return jobDetail;
        }
    
        @Bean(name = "jobTrigger")
        public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
            CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
            tigger.setJobDetail(jobDetail.getObject());
            tigger.setCronExpression("*/5 * * * * ?");// 每五秒执行一次
            tigger.setName("myTigger");// trigger的name
            return tigger;
        }
    
        @Bean(name = "scheduler")
        public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) {
            SchedulerFactoryBean bean = new SchedulerFactoryBean();
            // 设置是否任意一个已定义的Job会覆盖现在的Job。默认为false,即已定义的Job不会覆盖现有的Job。
            bean.setOverwriteExistingJobs(true);
            // 延时启动,应用启动5秒后 ,定时器才开始启动
            bean.setStartupDelay(5);
            // 注册定时触发器
            bean.setTriggers(cronJobTrigger);
            return bean;
        }
    
        // 多任务时的Scheduler,动态设置Trigger。一个SchedulerFactoryBean可能会有多个Trigger
        @Bean(name = "multitaskScheduler")
        public SchedulerFactoryBean schedulerFactoryBean() {
            SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
            return schedulerFactoryBean;
        }
    }
    package com.tszr.time;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    @SpringBootApplication
    @EnableScheduling
    public class TimeSpringApplication {
        public static void main(String[] args) {
            SpringApplication.run(TimeSpringApplication.class,args);
        }
    }

  • 相关阅读:
    Domain Model
    linux 后台运行命令
    morphia(3)-查询
    [八省联考2018] 劈配
    [BZOJ 3218] a+b Problem
    [学习笔记] KM算法
    [HNOI2013] 消毒
    [HNOI2014] 画框
    [HDU 6057] Kanade's convolution
    [模板] 任意模数多项式乘法
  • 原文地址:https://www.cnblogs.com/tszr/p/15449428.html
Copyright © 2011-2022 走看看