现实中的很多定时任务并不像网上的那种写法那么简单都是直接通过注解的形式实现(@Scheduled(fixedRate = 10000))。我就遇到了从数据库读取相关的数据(可能有n条)然后根据数据的触发时间生成多个动态任务添加到Scheduler中,当到达触发点时自动触发该任务。

废话不多说,直接上代码:

核心调度类:

package com.xx.task;import org.apache.commons.lang3.StringUtils;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;/*** @author xiaofeng* @version V1.0* @title: CustomQuartzScheduler* @package: com.xx.task* @description: 自定义job* @date 2019/4/19 10:32*/
@Component
public class CustomQuartzScheduler {private Logger logger = LoggerFactory.getLogger(getClass());@Autowiredprivate Scheduler scheduler;/*** 开始执行所有任务*/public void startJob() {try {scheduler.start();} catch (SchedulerException e) {e.printStackTrace();}}/*** 获取job信息** @param jobName* @param groupName* @return*/public String getJobInfo(String jobName, String groupName) {TriggerKey triggerKey = new TriggerKey(jobName, groupName);CronTrigger cronTrigger = null;try {cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);return String.format("time:%s,state:%s", cronTrigger.getCronExpression(),scheduler.getTriggerState(triggerKey).name());} catch (SchedulerException e) {e.printStackTrace();}return null;}/*** 修改某个任务的执行时间** @param jobName* @param groupName* @param cronExpress* @return*/public boolean modifyJobWithCronExpress(String jobName, String groupName, String cronExpress) {Date date = null;TriggerKey triggerKey = new TriggerKey(jobName, groupName);CronTrigger cronTrigger = null;try {cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);String oldTime = cronTrigger.getCronExpression();if (!oldTime.equalsIgnoreCase(cronExpress)) {CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpress);CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName).withSchedule(cronScheduleBuilder).build();date = scheduler.rescheduleJob(triggerKey, trigger);}return date != null;} catch (SchedulerException e) {e.printStackTrace();}return false;}/*** 修改某个任务的执行时间** @param jobName* @param groupName* @param startAt* @param endAt* @return*/public boolean modifyJobWithTime(String jobName, String groupName, Date startAt, Date endAt) {Date date = null;TriggerKey triggerKey = new TriggerKey(jobName, groupName);Trigger oldTrigger = null;try {oldTrigger = scheduler.getTrigger(triggerKey);Date startTime = oldTrigger.getStartTime();Date endTime = oldTrigger.getEndTime();TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity(jobName, groupName);if (startTime.compareTo(startAt) != 0) {triggerBuilder.startAt(startAt);}if (endTime.compareTo(endAt) != 0) {triggerBuilder.endAt(endAt);}Trigger trigger = triggerBuilder.build();date = scheduler.rescheduleJob(triggerKey, trigger);return date != null;} catch (SchedulerException e) {e.printStackTrace();}return false;}/*** 暂停所有任务*/public void pauseAllJob() {try {scheduler.pauseAll();} catch (SchedulerException e) {e.printStackTrace();}}/*** 暂停某个任务** @param jobName* @param groupName*/public void pauseJob(String jobName, String groupName) {JobKey jobKey = new JobKey(jobName, groupName);JobDetail jobDetail = null;try {jobDetail = scheduler.getJobDetail(jobKey);if (jobDetail == null) {return;}scheduler.pauseJob(jobKey);} catch (SchedulerException e) {e.printStackTrace();}}/*** 恢复所有任务*/public void resumeAllJob() {try {scheduler.resumeAll();} catch (SchedulerException e) {e.printStackTrace();}}/*** 恢复某个任务** @param jobName* @param groupName*/public void resumeJob(String jobName, String groupName) {JobKey jobKey = new JobKey(jobName, groupName);JobDetail jobDetail = null;try {jobDetail = scheduler.getJobDetail(jobKey);if (jobDetail == null) {return;}scheduler.resumeJob(jobKey);} catch (SchedulerException e) {e.printStackTrace();}}/*** 删除某个任务** @param jobName* @param groupName*/public void deleteJob(String jobName, String groupName) {JobKey jobKey = new JobKey(jobName, groupName);JobDetail jobDetail = null;try {jobDetail = scheduler.getJobDetail(jobKey);if (jobDetail == null) {return;}scheduler.deleteJob(jobKey);} catch (SchedulerException e) {e.printStackTrace();}}/*** add job** @param jobName* @param groupName* @param cronExpress* @param clz         execute class* @param params      jobData*/public void addJobByCron(String jobName, String groupName, String cronExpress, Class clz, Map<String, String> params) {if (StringUtils.isBlank(cronExpress)) {logger.error("{} cronExpress can't be null, CronScheduleBuilder need cronExpress to execute ~ ");return;}// build jobJobBuilder jobBuilder = JobBuilder.newJob(clz);if (params != null) {params.entrySet().stream().forEach(stringObjectEntry -> {jobBuilder.usingJobData(stringObjectEntry.getKey(), stringObjectEntry.getValue());});}JobDetail jobDetail = jobBuilder.withIdentity(jobName, groupName).build();// build trigger base on CronTriggerCronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpress);CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName).withSchedule(cronScheduleBuilder).build();try {scheduler.scheduleJob(jobDetail, cronTrigger);} catch (SchedulerException e) {e.printStackTrace();}}/*** add job** @param jobName* @param groupName* @param clz       execute class* @param startAt   startTime* @param endAt     endTime* @param params    jobData*/public void addJob(String jobName, String groupName, Class clz, Date startAt, Date endAt, Map<String, String> params) {if (startAt == null) {logger.error("{} startAt can't be null, TriggerBuilder need trigger time to execute ~ ");return;}//build jobJobBuilder jobBuilder = JobBuilder.newJob(clz);if (params != null) {params.entrySet().stream().forEach(stringObjectEntry -> {jobBuilder.usingJobData(stringObjectEntry.getKey(), stringObjectEntry.getValue());});}JobDetail jobDetail = jobBuilder.withIdentity(jobName, groupName).build();//build trigger base timeTriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().startAt(startAt).withIdentity(jobName, groupName);if (endAt != null) {triggerBuilder.endAt(endAt);}Trigger trigger = triggerBuilder.build();try {scheduler.scheduleJob(jobDetail, trigger);} catch (SchedulerException e) {e.printStackTrace();}}}

其中注意需要传递参数可以使用usingJobData这个方法。

通过启动加载所有的任务到容器中:

package com.xx.init;import com.google.common.collect.Maps;
import com.lema.rakeback.model.extra.CompanyInfoVo;
import com.lema.rakeback.service.superm.CompanyInfoService;
import com.lema.rakeback.task.CustomQuartzScheduler;
import com.lema.rakeback.task.job.EnterpriseGrantEndJob;
import com.lema.rakeback.task.job.EnterpriseGrantStartJob;
import com.lema.rakeback.utils.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;import java.util.List;
import java.util.Map;/*** @author xiaofeng* @version V1.0* @title: AppStartupRunner.java* @package: com.xx.init* @description: 服务器启动加载数据* @date 2019/4/19 10:41*/
@Component
@Order(value = 0)
public class AppStartupRunner implements ApplicationRunner {Logger logger = LoggerFactory.getLogger(getClass());@Autowiredprivate CustomQuartzScheduler quartzScheduler;@Autowiredprivate CompanyInfoService companyInfoService;@Overridepublic void run(ApplicationArguments applicationArguments) {logger.info(">>>>>>>>>服务启动后初始化操作,执行后台job操作<<<<<<<<<");List<CompanyInfoVo> companyInfoVos = companyInfoService.queryForList(0, null, null, null, 0, Integer.MAX_VALUE);if (!CollectionUtils.isEmpty(companyInfoVos)) {companyInfoVos.stream().forEach(companyInfoVo -> {String jobName1 = "job_" + companyInfoVo.getId() + "_start";String groupName1 = "group_" + companyInfoVo.getId() + "_start";String jobName2 = "job_" + companyInfoVo.getId() + "_end";String groupName2 = "group_" + companyInfoVo.getId() + "_end";Map<String, String> params = Maps.newHashMap();params.put("id", String.valueOf(companyInfoVo.getId()));
//                quartzScheduler.addJob(jobName1, gropName1, EnterpriseGrantStartJob.class, DateUtil.string2date2(companyInfoVo.getStartTime()), null, params);
//                quartzScheduler.addJob(jobName2, groupName2, EnterpriseGrantEndJob.class, DateUtil.string2date2(companyInfoVo.getEndTime()), null, params);quartzScheduler.addJobByCron(jobName1, groupName1, DateUtil.getCron(DateUtil.string2date2(companyInfoVo.getStartTime())), EnterpriseGrantStartJob.class, params);quartzScheduler.addJobByCron(jobName2, groupName2, DateUtil.getCron(DateUtil.string2date2(companyInfoVo.getEndTime())), EnterpriseGrantEndJob.class, params);});}logger.info(">>>>>>>>>后台job任务已经启动...<<<<<<<<<");}
}

业务执行相关类:

package com.xx.task.job;import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @author xiaofeng* @version V1.0* @title: EnterpriseGrantStartJob* @package: com.xx.task.job* @description: 企业授权开始job* @date 2019/4/19 11:40*/
public class EnterpriseGrantStartJob implements Job {private Logger logger = LoggerFactory.getLogger(getClass());private void before() {logger.info("=================StartJob before===============");}@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {before();JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();/*** @// TODO: 2019/4/19 获取参数,执行业务 */Long id = jobDataMap.getLong("id");after();}private void after() {logger.info("=================StartJob before===============");}}

注意:需要引入的pom依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>

ok,启动即可

springboot quartz动态任务处理相关推荐

  1. SpringBoot+Quartz动态管理定时任务

    前置理论: 1.小顶堆(适合任务少的,因为向下调整耗费性能) 堆:是一完全二叉树(除了最后一层节点其他层都达到最大节点数,且最后一层都靠左排列):堆中某个节点的值总不大于或不小于其父节点. 定时任务是 ...

  2. springboot quartz 动态配置_springboot集成quartz实现动态任务调度

    quartz是一个开源的作业调度框架,本文就是介绍下springboot框架下继承quartz的一些使用示例 首先我们需要添加quartz的spring-boot-starter-quartz依赖 o ...

  3. java quartz 动态执行,浅谈SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Schedule ...

  4. Quartz动态添加,修改,删除任务(暂停,任务状态,恢复,最近触发时间)

    首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 消息 登录注册 关闭 quartz_Cron表达式一分钟教程 09-05 ...

  5. 第四十章:基于SpringBoot Quartz完成定时任务分布式多节点负载持久化

    在上一章[第三十九章:基于SpringBoot & Quartz完成定时任务分布式单节点持久化]中我们已经完成了任务的持久化,当我们创建一个任务时任务会被quartz定时任务框架自动持久化到数 ...

  6. SpringBoot+Quartz+数据库存储(附完整代码和数据库脚本)

    目录 1.pom文件依赖 2.Druid连接池的Quartz扩展类 3 .application.yml文件 4 .修改quartz.properties配置 5 . 在数据库中创建quartz相关的 ...

  7. Quartz动态添加、修改和删除定时任务

    2019独角兽企业重金招聘Python工程师标准>>> Quartz动态添加.修改和删除定时任务 转载于:https://my.oschina.net/haokevin/blog/1 ...

  8. springboot+Quartz整合!!!简单实用

    一.什么是Quartz 在Quartz官网上是这么写的 Quartz官网 1.Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制 ...

  9. 解决springboot + quartz的分布式问题以及dolphinscheduler

    springboot + quartz 将quartz存储默认在内存中, 多节点部署时存在分布式问题. 改成基于数据库的quartz分布式集群解决方案, 参考官方文档, 需要为quartz单独配置da ...

最新文章

  1. shell脚本编程基础
  2. android 网络广播 类似QQ动态检查网络
  3. static_cast与c风格的强制类型转换比较
  4. 设置TabBar分栏控制器上图片的大小问题
  5. java内存块_JVM上的并发和Java内存模型之同步块笔记
  6. 北京内推 | 启元实验室招聘视觉感知算法工程师(北京事业单位)
  7. ASP.NET实现推送文件到浏览器的方法
  8. Quartz框架基于Calendar的排除规则
  9. Jar Hell变得轻松–用jHades揭秘classpath
  10. c语言学习加强营(一):switch分支
  11. testng连接MySQL_Selenium+TestNG实战-8-连接数据库方法去验证文章是否发布
  12. getParameterMap()的返回值为MapString, String[],从其中取得请求参数转为MapString, String的方法如下:...
  13. 【CentOS后遗症】刚毕业的运维小姐姐 Linux用不了!你的也用不了了~
  14. 搜索c盘大文件_硬核干货,如何给c盘“减肥”?
  15. 用HTML5 Canvas为Web图形创建特效
  16. Zookeeper 客户端 Curator 使用详解
  17. 软件工程-图书馆管理系统
  18. 关闭app服务器系统,ios12系统服务哪些关掉
  19. Geth私链的多节点运行
  20. 入职体检(三甲医院)

热门文章

  1. A problem occurred starting process 'command 'G:\Android\sdk\ndk-bundle\toolchains\mips64el-linux-an
  2. linux内核跳转到文件系统,Uboot到Kernel到文件系统(Cortex_A9)移植详细文档
  3. 【java基础】zip压缩文件
  4. Linux集群和自动化维1.4.2 优化Linux下的内核TCP参数以提高系统性能
  5. Redis Cluster搭建方法简介22211111
  6. Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR
  7. 最简单的java WebService服务器端搭建
  8. android学习总结
  9. [NHibernate]获取分组查询的记录总数
  10. 精妙SQL语句【转】