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);
        }
    }

  • 相关阅读:
    Algorithm Gossip (48) 上三角、下三角、对称矩阵
    .Algorithm Gossip (47) 多维矩阵转一维矩阵
    Algorithm Gossip (46) 稀疏矩阵存储
    Algorithm Gossip (45) 费氏搜寻法
    Algorithm Gossip (44) 插补搜寻法
    Algorithm Gossip (43) 二分搜寻法
    Algorithm Gossip (42) 循序搜寻法(使用卫兵)
    Algorithm Gossip (41) 基数排序法
    Algorithm Gossip (40) 合并排序法
    AlgorithmGossip (39) 快速排序法 ( 三 )
  • 原文地址:https://www.cnblogs.com/tszr/p/15449428.html
Copyright © 2011-2022 走看看