知识改变命运! Spring Boot系列5-定时任务-springboot整合quartz实现动态定时任务_猿份哥-lskyf博客社区

Spring Boot系列5-定时任务-springboot整合quartz实现动态定时任务

猿份哥 1年前 ⋅ 3381 阅读 ⋅ 37 个赞

MyJob实现Job接口,重写execute方法在里面操作我们要执行的业务逻辑。

@Slf4j
public class MyJob implements Job {
    @Autowired
    private MyService myService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        log.info("任务开始执行了");
        try {
            executeTask();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        log.info("任务执行结束了");
    }

    private void executeTask() throws SchedulerException {
        myService.bizFunction();
    }
}


定义QuartzManager管理我们的定时任务方法

**
 * @author 天空蓝蓝的
 */
@Configuration
public class QuartzManager {

 public static final String JOB1="job1";
 public static final String GROUP1="group1";
 /**默认每个星期凌晨一点执行*/
 //public static final String DEFAULT_CRON="0 0 1 ? * L";
 /**默认5秒执行一次*/
 public static final String DEFAULT_CRON="*/5 * * * * ?";

 /**
 * 任务调度
 */
 @Autowired
 private Scheduler scheduler;

 /**
 * 开始执行定时任务
 */
 public void startJob() throws SchedulerException {
 startJobTask(scheduler);
 scheduler.start();
 }

 /**
 * 启动定时任务
 * @param scheduler
 */
 private void startJobTask(Scheduler scheduler) throws SchedulerException {
 JobDetail jobDetail= JobBuilder.newJob(MyJob.class).withIdentity(JOB1,GROUP1).build();
 CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(DEFAULT_CRON);
 CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity(JOB1,GROUP1)
 .withSchedule(cronScheduleBuilder).build();
 scheduler.scheduleJob(jobDetail,cronTrigger);

 }
 /**
 * 获取Job信息
 * @param name
 * @param group
 */
 public String getjobInfo(String name,String group) throws SchedulerException {
 TriggerKey triggerKey=new TriggerKey(name,group);
 CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
 return String.format("time:%s,state:%s",cronTrigger.getCron,
 scheduler.getTriggerState(triggerKey).name());
 }

 /**
 * 修改任务的执行时间
 * @param name
 * @param group
 * @param cron cron表达式
 * @return
 * @throws SchedulerException
 */
 public boolean modifyJob(String name,String group,String cron) throws SchedulerException{
 Date date=null;
 TriggerKey triggerKey=new TriggerKey(name, group);
 CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
 String oldTime=cronTrigger.getCron;
 if (!oldTime.equalsIgnoreCase(cron)){
 CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(cron);
 CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(name,group)
 .withSchedule(cronScheduleBuilder).build();
 date=scheduler.rescheduleJob(triggerKey,trigger);
 }
 return date !=null;
 }

 /**
 * 暂停所有任务
 * @throws SchedulerException
 */
 public void pauseAllJob()throws SchedulerException{
 scheduler.pauseAll();
 }

 /**
 * 暂停某个任务
 * @param name
 * @param group
 * @throws SchedulerException
 */
 public void pauseJob(String name,String group)throws SchedulerException{
 JobKey jobKey=new JobKey(name,group);
 JobDetail jobDetail=scheduler.getJobDetail(jobKey);
 if (jobDetail==null)
 return;
 scheduler.pauseJob(jobKey);
 }

 /**
 * 恢复所有任务
 * @throws SchedulerException
 */
 public void resumeAllJob()throws SchedulerException{
 scheduler.resumeAll();
 }
 /**
 * 恢复某个任务
 */
 public void resumeJob(String name,String group)throws SchedulerException{
 JobKey jobKey=new JobKey(name,group);
 JobDetail jobDetail=scheduler.getJobDetail(jobKey);
 if (jobDetail==null)
 return;
 scheduler.resumeJob(jobKey);
 }

 /**
 * 删除某个任务
 * @param name
 * @param group
 * @throws SchedulerException
 */
 public void deleteJob(String name,String group)throws SchedulerException{
 JobKey jobKey=new JobKey(name, group);
 JobDetail jobDetail=scheduler.getJobDetail(jobKey);
 if (jobDetail==null)
 return;
 scheduler.deleteJob(jobKey);
 }

}


定义ApplicationStartQuartzJobListener实现当应用启动,或刷新时,启动我们的定时任务

/**
 * @author 天空蓝蓝的
 */
@Slf4j
@Configuration
public class ApplicationStartQuartzJobListener implements ApplicationListener {

 @Autowired
 private QuartzManager quartzManager;


 @Override
 public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
 try {
 quartzManager.startJob();
 log.info("任务已经启动......");
 } catch (SchedulerException e) {
 e.printStackTrace();
 }
 }
 /**
 * 初始注入scheduler
 */
 @Bean
 public Scheduler scheduler() throws SchedulerException{
 SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
 return schedulerFactoryBean.getScheduler();
 }
}



定义MyJobFactory创建Quartz实例

/**
 * @author 天空蓝蓝的
 */
@Component
public class MyJobFactory extends AdaptableJobFactory{
 @Autowired
 private AutowireCapableBeanFactory capableBeanFactory;

 @Override
 protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
 // 调用父类的方法
 Object jobInstance = super.createJobInstance(bundle);
 // 进行注入
 capableBeanFactory.autowireBean(jobInstance);
 return jobInstance;
 }
}


Application如何类Start注入MyJobFactory和Scheduler

/**
 * @author 天空蓝蓝的
 */
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@Configuration
public class Start {

 public static void main(String[] args) {
 SpringApplication.run(Start.class, args);
 }

 @Autowired
 private MyJobFactory myJobFactory;

 @Bean
 public SchedulerFactoryBean schedulerFactoryBean() {
 SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
 schedulerFactoryBean.setJobFactory(myJobFactory);
 System.out.println("myJobFactory:"+myJobFactory);
 return schedulerFactoryBean;
 }
 @Bean
 public Scheduler scheduler() {
 return schedulerFactoryBean().getScheduler();
 }
}


定义ModifyCronController动态修改定时任务

/**
 * @author 天空蓝蓝的
 */
@RestController
public class ModifyCronController {

 @Autowired
 private QuartzManager quartzManager;
 @GetMapping("modify")
 public String modify() throws SchedulerException {
 /**10秒执行一次*/
 String cron="*/10 * * * * ?";
 quartzManager.pauseJob(QuartzManager.JOB1,QuartzManager.GROUP1);
 quartzManager.modifyJob(QuartzManager.JOB1,QuartzManager.GROUP1,cron);
 return "ok";
 }
}
浏览器访问http://localhost:8080/modify我们可以看到将默认的5秒执行一次任务动态变成了10秒执行一次了

源码下载链接 https://github.com/tiankonglanlande/springboot

全部评论: 0

    我有话说:

    spring boot系列4-定时任务-springboot自带的scheduled超级简单

    需求:创建一个每天凌晨0点执行的定时任务1.创建任务 /** * @author 天空蓝蓝的 */ @Slf4j @EnableScheduling @Component public class

    Spring Boot系列1-helloword

      使用springboot简单轻松创建helloword SpringBoot系列1-helloword 关于springboot这是摘自官方的一段话 Spring Boot

    SpringBoot系列9-使用jasypt自定义stater运行时动态传入加密密码

    文章目录 1.新建springboot-encryption-configuration项目实现stater 2.pom文件引入jasypt 3.在resources/support/下配置

    Spring Boot系列7-SpringBoot+mybatis+druid+TypeHandler

    介绍在SpringBoot中集成mybatis和druid以及自定义TypeHandler 创建数据库表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- --------------------...

    SpringBoot系列21-实现策略模式

    如何在spring boot 中使用@component 实现策略模式 1.在 Spring Boot实现策略模式可以使用 @Component 注解来将策略类标记为 Spring 的组件,并

    SpringBoot系列19-防止重复请求,重复表单提交超级简单注解的实现之四(终极版II)

    前言: 根据最新spring boot:2.5.0版本和在《SpringBoot防止重复请求,重复表单提交超级简单的注解实现之四(终极版I)》之上化繁为简抽取更实用的代码,新增超时机制 防重复提交

    Spring Boot系列6-SpringBoot中使用servlet

    介绍在SpringBoot中如何使用servlet pom.xml <dependency> <groupId>org.springframework.boot<

    SpringBoot系列16-Spring boot2x快速整合swagger2(Open Api3注解版)

    前言:为什么要使用swagger 传统的web开发,前端和后端的HTTP接口文档交互都是使用word文档记录,存在不仅限于这些问题;不能时时更新,不易于传输etc. swagger2可以使用配置文件的方式和注解的方式生成HTTP请求文档代码各有优...

    spring boot面试题及答案持续更新中

    2019-07-28最新整理spring boot面试题及答案 1.Spring Boot是什么 这是摘自官方的一段话 Spring Boot is designed to get you up

    java高频面试题-Spring Boot的自动配置是如何工作的,以及它的优点是什么?

    Spring Boot的自动配置是其设计理念的核心之一,它通过约定大于配置的思想,为开发者提供了一种零配置的开发体验。以下是对这个问题的详细解答: 自动配置原理: Spring Boot通过

    ...jar中没有主清单属性, spring boot或者spring cloud的maven项目 java -jar test.jar 方式启动报错:...jar中没有主清单属性

    1.spring boot或者spring cloud的maven项目老是遇到问题...jar中没有主清单属性 2.解决方法:在pom.xml中添加如下代码 <build> <

    Spring Boot系列2-全局统一异常处理

    原创: 天空和唯美 天空唯美  点击查看原文 为什么要全局统一异常处理呢?如果系统发生了异常,不做统一异常处理,前端会给用户展示一大片看不懂的文字。做统一异常处理后当

    springboot1.5.9升级到springboot2.1.3遇到的问题

    1.问题描述: Failed to bind properties under 'spring.datasource.druid.driver' to java.sql.Driver:  

    加入公众号
    加入公众号