• 【定时任务】Spring Boot 中如何使用 Quartz


    这篇文章将介绍如何在Spring Boot 中使用Quartz。

    一、首先在 pom.xml 中添加 Quartz 依赖。

         <!-- quartz依赖 -->
            <dependency>  
                <groupId>org.quartz-scheduler</groupId>  
                <artifactId>quartz</artifactId>  
                <version>2.2.1</version>  
            </dependency>  
            
            <!-- 该依赖必加,里面有spring对schedule的支持 --> 
            <dependency> 
                <groupId>org.springframework</groupId>  
                <artifactId>spring-context-support</artifactId>  
            </dependency>  

    二、编写任务类,里面编写希望得到定时执行的具体任务。注意在任务类上需要添加 @Component 注解,方便Spring 扫描到该组件并注解到Spring 容器中。

    /**
     * 定时任务
     * @author lWX515915
     *
     */
    @Component
    public class MyTask{
        
        public void task1() {
            System.out.println("this is task1 time: " + new Date());
        }
    
    }

    三、然后编写配置类 QuartzConfig ,该类中使用Java代码详细描述了如何配置Quartz。类前添加@Configuration注解 表示这是配置类

    @Configuration 表示这个类会声明一个或者多个 Bean 类 并且有可能会被Spring 容器处理来生成bean的定义和bean对应的服务请求。

    在configuration类中,我们需要对三个对象JobDetail、Trigger 和 Scheduler 进行配置。

    /**
     * Quartz配置类
     * @author lWX515915
     *
     */
    @Configuration
    public class QuartzConfig
    {
        ...
    }

    1、配置JobDetail

      @Bean表示该方法返回一个bean,并交付Spring容器管理 。

      参数是任务,setTargetObject 是设置具体的执行目标,setTargetMethod 是设置具体的执行方法。

      MethodInvokingJobDetailFactoryBean 是JobDetail 的 bean 工厂。

      /**
         * 配置JobDetail
         * @param scheduledTask  需要被执行的任务
         * @return
         */
        @Bean(name="jobDetail")
        public MethodInvokingJobDetailFactoryBean detailFactoryBean(MyTask task) {
            MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
            
            jobDetail.setConcurrent(false);//设置多任务是否采用并发模式
            
            jobDetail.setName("job1"); 
            jobDetail.setGroup("group1");
            
            jobDetail.setTargetObject(task); //设置具体执行目标 
            jobDetail.setTargetMethod("task1"); //设置具体执行方法
            
            return jobDetail;      
        }

    2、配置 Trigger

      其中参数表示JobDetail,这里就是我们之前注册到Spring 容器中的JobDetail bean。

      setJobDetail 设置具体的任务。

      setCronExpression 设置cron 表达式。

      返回值是CronTriggerFactoryBean,是一个CronTrigger对应的bean factory。

      /**
         * 配置trigger
         * @param jobDetail
         * @return
         */
        @Bean(name="jobTrigger")
        public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
            CronTriggerFactoryBean jobTrigger = new CronTriggerFactoryBean();
            jobTrigger.setJobDetail(jobDetail.getObject());
            jobTrigger.setCronExpression("0/10 * * ? * *");
            jobTrigger.setName("jobTrigger");
            return jobTrigger;
        }

    3、配置Scheduler

      其中setOverwriteExistingJobs 设置是否更新已经存在的job

      setTriggers 设置trigger

      返回scheduler 对应的bean工厂

      /**
         * 配置调度器
         * @param trigger
         * @return
         */
        @Bean(name="jobSchedule")
        public SchedulerFactoryBean schedulerFactory(CronTriggerFactoryBean trigger) {
            SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
            
            schedulerFactory.setOverwriteExistingJobs(true);//设置更新已经存在的job
            schedulerFactory.setTriggers(trigger.getObject());
            
            return schedulerFactory;
        }

    经过上面三个步骤,Quartz 的配置类就已经完成了

    四、启动应用 查看结果,下面是运行的结果。可以看到实现了我们想要的结果。

     综上,Spring Boot 中使用 Quartz 的关键在与 Quartz 的配置。

  • 相关阅读:
    "Key Violation" with ClientDataSet
    c# 的关键字 params,out,ref
    eval && JSON.parse
    json2.js
    C#中的索引器
    call , apply , caller , callee
    iphone&ipad图标去除高亮的光圈效果
    调用系统路线导航
    调科大讯飞出现的问题
    得到汉字首字母在表中的顺序位置
  • 原文地址:https://www.cnblogs.com/cuglkb/p/7803083.html
Copyright © 2020-2023  润新知