博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot集成持久化Quartz定时任务管理
阅读量:6939 次
发布时间:2019-06-27

本文共 10765 字,大约阅读时间需要 35 分钟。

hot3.png

首先在项目pom.xml中添加Quartz依赖

        
           
org.quartz-scheduler
           
quartz
           
2.2.1
       
       
           
org.springframework
           
spring-context-support
       

我们在src/main/resources目录下再新建一个名为quartz.properties的文件。这是对Quartz的配置文件。加入如下代码:

# \u56FA\u5B9A\u524D\u7F00org.quartz# \u4E3B\u8981\u5206\u4E3Ascheduler\u3001threadPool\u3001jobStore\u3001plugin\u7B49\u90E8\u5206##org.quartz.scheduler.instanceName = DefaultQuartzSchedulerorg.quartz.scheduler.rmi.export = falseorg.quartz.scheduler.rmi.proxy = falseorg.quartz.scheduler.wrapJobExecutionInUserTransaction = false# \u5B9E\u4F8B\u5316ThreadPool\u65F6\uFF0C\u4F7F\u7528\u7684\u7EBF\u7A0B\u7C7B\u4E3ASimpleThreadPoolorg.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool# threadCount\u548CthreadPriority\u5C06\u4EE5setter\u7684\u5F62\u5F0F\u6CE8\u5165ThreadPool\u5B9E\u4F8B# \u5E76\u53D1\u4E2A\u6570org.quartz.threadPool.threadCount = 5# \u4F18\u5148\u7EA7org.quartz.threadPool.threadPriority = 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = trueorg.quartz.jobStore.misfireThreshold = 5000# \u9ED8\u8BA4\u5B58\u50A8\u5728\u5185\u5B58\u4E2Dorg.quartz.jobStore.class = org.quartz.simpl.RAMJobStore#\u6301\u4E45\u5316\uFF0C\u6570\u636E\u6E90\u7684\u94FE\u63A5\u65B9\u5F0F#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX#org.quartz.jobStore.tablePrefix = QRTZ_#org.quartz.jobStore.dataSource = qzDS#org.quartz.dataSource.qzDS.driver = com.mysql.jdbc.Driver#org.quartz.dataSource.qzDS.URL =#org.quartz.dataSource.qzDS.user = #org.quartz.dataSource.qzDS.password = #org.quartz.dataSource.qzDS.maxConnections = 10--------------------- \u4F5C\u8005\uFF1A\u8D75\u6DA6\u6CFD\u540C\u5B66 \u6765\u6E90\uFF1ACSDN \u539F\u6587\uFF1Ahttps://blog.csdn.net/qq_37804737/article/details/84335880 \u7248\u6743\u58F0\u660E\uFF1A\u672C\u6587\u4E3A\u535A\u4E3B\u539F\u521B\u6587\u7AE0\uFF0C\u8F6C\u8F7D\u8BF7\u9644\u4E0A\u535A\u6587\u94FE\u63A5\uFF01

可以看出和上一篇文章的配置文件完成相同。接着我们在com.api.utils下新建一个名为SchedulerConfig.java的文件。在这个文件里,对刚才我们新建的quartz.properties文件进行读取。

package com.api.utils;import java.io.IOException;import java.util.Properties;import org.quartz.Scheduler;import org.quartz.ee.servlet.QuartzInitializerListener;import org.springframework.beans.factory.config.PropertiesFactoryBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import org.springframework.scheduling.quartz.SchedulerFactoryBean;@Configurationpublic class SchedulerConfig {    @Bean(name="SchedulerFactory")    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {        SchedulerFactoryBean factory = new SchedulerFactoryBean();        factory.setQuartzProperties(quartzProperties());        return factory;    }    @Bean    public Properties quartzProperties() throws IOException {        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));        //在quartz.properties中的属性被读取并注入后再初始化对象        propertiesFactoryBean.afterPropertiesSet();        return propertiesFactoryBean.getObject();    }    /*     * quartz初始化监听器     */    @Bean    public QuartzInitializerListener executorListener() {       return new QuartzInitializerListener();    }    /*     * 通过SchedulerFactoryBean获取Scheduler的实例     */    @Bean(name="Scheduler")    public Scheduler scheduler() throws IOException {        return schedulerFactoryBean().getScheduler();    }}

实现

先来看Job类。首先设置一个BaseJob接口,用来继承Job类:

package com.api.utils;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;public interface BaseJob extends Job {         public void execute(JobExecutionContext context) throws JobExecutionException;}

然后两个Job类用来实现BaseJob类: 

HelloJob

package com.api.utils;import java.util.Date;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory;   import org.quartz.JobExecutionContext;  import org.quartz.JobExecutionException;  public class HelloJob implements BaseJob {        private static Logger _log = LoggerFactory.getLogger(HelloJob.class);      public HelloJob() {      }      public void execute(JobExecutionContext context)          throws JobExecutionException {          _log.error("Hello Job执行时间: " + new Date());      }  }

NewJob

package com.api.utils;import java.util.Date;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  import org.quartz.JobExecutionContext;  import org.quartz.JobExecutionException;  public class NewJob implements BaseJob {      private static Logger _log = LoggerFactory.getLogger(NewJob.class);      public NewJob() {      }      public void execute(JobExecutionContext context)          throws JobExecutionException {          _log.error("New Job执行时间: " + new Date());      }  }

接下来我们可以先直接看一下看一下Controller

package com.api.controller;import org.quartz.CronScheduleBuilder;import org.quartz.CronTrigger;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.JobKey;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.TriggerBuilder;import org.quartz.TriggerKey;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import com.api.utils.BaseJob;@RestController@RequestMapping(value = "/job")public class JobController {    // 加入Qulifier注解,通过名称注入bean    @Autowired    @Qualifier("Scheduler")    private Scheduler scheduler;    @SuppressWarnings("unused")    private static Logger log = LoggerFactory.getLogger(JobController.class);    /**     * 添加任务     *      * @param jobClassName     * @param jobGroupName     * @param cronExpression     * @throws Exception     */    @PostMapping(value = "/addjob")    public void addjob(@RequestParam(value = "jobClassName") String jobClassName,            @RequestParam(value = "jobGroupName") String jobGroupName,            @RequestParam(value = "cronExpression") String cronExpression) throws Exception {        addJob(jobClassName, jobGroupName, cronExpression);    }    public void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception {        // 启动调度器        scheduler.start();        // 构建job信息        JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass())                .withIdentity(jobClassName, jobGroupName).build();        // 表达式调度构建器(即任务执行的时间)        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);        // 按新的cronExpression表达式构建一个新的trigger        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName)                .withSchedule(scheduleBuilder).build();        try {            scheduler.scheduleJob(jobDetail, trigger);        } catch (SchedulerException e) {            System.out.println("创建定时任务失败" + e);            throw new Exception("创建定时任务失败");        }    }    /**     * 暂停任务     *      * @param jobClassName     * @param jobGroupName     * @throws Exception     */    @PostMapping(value = "/pausejob")    public void pausejob(@RequestParam(value = "jobClassName") String jobClassName,            @RequestParam(value = "jobGroupName") String jobGroupName) throws Exception {        jobPause(jobClassName, jobGroupName);    }    public void jobPause(String jobClassName, String jobGroupName) throws Exception {        scheduler.pauseJob(JobKey.jobKey(jobClassName, jobGroupName));    }    /**     * 继续任务     *      * @param jobClassName     * @param jobGroupName     * @throws Exception     */    @PostMapping(value = "/resumejob")    public void resumejob(@RequestParam(value = "jobClassName") String jobClassName,            @RequestParam(value = "jobGroupName") String jobGroupName) throws Exception {        jobresume(jobClassName, jobGroupName);    }    public void jobresume(String jobClassName, String jobGroupName) throws Exception {        scheduler.resumeJob(JobKey.jobKey(jobClassName, jobGroupName));    }    /**     * 重新安排任务     *      * @param jobClassName     * @param jobGroupName     * @param cronExpression     * @throws Exception     */    @PostMapping(value = "/reschedulejob")    public void rescheduleJob(@RequestParam(value = "jobClassName") String jobClassName,            @RequestParam(value = "jobGroupName") String jobGroupName,            @RequestParam(value = "cronExpression") String cronExpression) throws Exception {        jobreschedule(jobClassName, jobGroupName, cronExpression);    }    public void jobreschedule(String jobClassName, String jobGroupName, String cronExpression) throws Exception {        try {            TriggerKey triggerKey = TriggerKey.triggerKey(jobClassName, jobGroupName);            // 表达式调度构建器            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);            // 按新的cronExpression表达式重新构建trigger            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();            // 按新的trigger重新设置job执行            scheduler.rescheduleJob(triggerKey, trigger);        } catch (SchedulerException e) {            System.out.println("更新定时任务失败" + e);            throw new Exception("更新定时任务失败");        }    }    /**     * 删除任务     *      * @param jobClassName     * @param jobGroupName     * @throws Exception     */    @PostMapping(value = "/deletejob")    public void deletejob(@RequestParam(value = "jobClassName") String jobClassName,            @RequestParam(value = "jobGroupName") String jobGroupName) throws Exception {        jobdelete(jobClassName, jobGroupName);    }    public void jobdelete(String jobClassName, String jobGroupName) throws Exception {        scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName));        scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName));        scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName));    }    public static BaseJob getClass(String classname) throws Exception {        Class
class1 = Class.forName(classname);        return (BaseJob) class1.newInstance();    }}

注意最下面的这个方法,根据类名称,通过反射得到该类,然后创建一个BaseJob的实例。由于NewJob和HelloJob都实现了BaseJob,所以这里不需要我们手动去判断

转载于:https://my.oschina.net/waitforyou/blog/3024406

你可能感兴趣的文章
Eclipse 开发配置
查看>>
IDEA快捷键快速查看跳转当前类的方法
查看>>
Oracle Internal Event:10200 Consistent Read诊断事件
查看>>
正则表达式校验IP地址
查看>>
Exchange 常见问题之二----5
查看>>
Linux学习网站
查看>>
CentOS防火墙iptables的配置方法详解
查看>>
puppet客户端取消主动更新
查看>>
redis 3.0.7 安装部署
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
如何查看mysql的用户及授权
查看>>
有趣的指针
查看>>
<Power Shell>新的征程
查看>>
使用FFmpeg新解码API解封装解码音视频(代码实例)
查看>>
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
查看>>
Windows 服务器系统的服务概述和网络端口要求
查看>>
SQLite操作
查看>>
安装Gogs及简单配置(使用默认数据库)
查看>>
Linux 常用命令
查看>>
奔向新纪元,Vista安装经历
查看>>