spring boot框架整合quartz实现定时任务

一、前言

       最近,因项目需求在需实现定时器功能,在网上参考各种博客,或多或少都存在些许问题,于是我决定发表这篇博客,一方面将我的经验分享给大家,另一方面也方便日后温习,若文中有不足之处望大家多担待多指教。

二、创建spring boot项目

      创建spring boot项目(spring boot项目创建过程这里就不详细介绍),添加quartz的maven依赖:

<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>2.3.0</version>
</dependency>

三、编写任务类:

package com.yqjr.nmps.rest;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;


/**
 *@ClassName:QuartzRest
 *@Description:
 *@Author:sufengwu
 *@Date:2018/11/28 11:53
 **/
@Configuration
@Component 
@EnableScheduling 

public class QuartzRest {

    public void sayHello() {
        System.out.println("Hello world");
    }
}

四、Quartz配置类

package com.yqjr.nmps.common.util;

import com.yqjr.nmps.rest.QuartzRest;
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;

@Configuration
public class SchedledConfiguration {
    /**
     * attention:
     * Details:配置定时任务
     */
    @Bean(name = "detailFactoryBean")
    public MethodInvokingJobDetailFactoryBean detailFactoryBean(QuartzRest task) {// ScheduleTask为需要执行的任务
        MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
        /*
         *  是否并发执行
         *  例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
         *  如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
         */
        bean.setConcurrent(false);
        /*
         * 为需要执行的实体类对应的对象
         */
        bean.setTargetObject(task);
        /*
         * sayHello为需要执行的方法
         * 通过这几个配置,告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的sayHello方法
         */
        bean.setTargetMethod("sayHello");
        System.out.println("detailFactoryBean");
        return bean;
    }

    /**
     * attention:
     * Details:配置定时任务的触发器,也就是什么时候触发执行定时任务
     */
    @Bean(name = "jobTrigger")
    public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean detailFactoryBean) {
        CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
        tigger.setJobDetail(detailFactoryBean.getObject());
        tigger.setCronExpression("0 30 20 * * ?");// 初始时的cron表达式
        System.out.println("cronJobTrigger");
        return tigger;
    }

    /**
     * attention:
     * Details:定义quartz调度工厂
     */
    @Bean(name="scheduler")
    public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        // 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
        bean.setOverwriteExistingJobs(true);
        // 延时启动,应用启动1秒后
        bean.setStartupDelay(1);
        // 注册触发器
        bean.setTriggers(cronJobTrigger);
        System.out.println("schedulerFactory");
        return bean;
    }
}

五、定时方法:

package com.yqjr.nmps.rest;/**
 * @ClassName:ScheduleRefreshDatabase
 * @Description:
 * @Author:sufengwu
 * @Date:2018/11/28 15:33
 */

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;

/**
 *@ClassName:ScheduleRefreshDatabase
 *@Description:
 *@Author:sufengwu
 *@Date:2018/11/28 15:33
 **/
@Configuration
@EnableScheduling
@Component
public class ScheduleRefresh {

        @Resource(name = "detailFactoryBean")
        private JobDetail jobDetail;

        @Resource(name = "jobTrigger")
        private CronTrigger cronTrigger;

        @Resource(name = "scheduler")
        private Scheduler scheduler;

        @Scheduled(fixedRate = 1000*60)
        public void scheduleUpdateCronTrigger() throws SchedulerException {
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(cronTrigger.getKey());
            String currentCron = trigger.getCronExpression();  // 当前Trigger使用的

        }
    }

这样一个简单的定时器功能就完成了。

参考文章:https://blog.csdn.net/liuchuanhong1/article/details/60873295

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值