今天有个需求,前端可以将定时任务自定义保存到数据库,每天根据查询数据库来执行任务。

其实不用动态也是可以实现,但是。也是想试试动态执行定时任务看看怎么样的。

(1)建立一个QuartzManage类

package com.bsoft.homecare.schedule;import org.quartz.*;/*** @auther: wujj* @date: 2018/8/20 14:25* @description:*/
public class QuartzManager {private Scheduler scheduler;/*** @Description: 添加一个定时任务** @param jobName 任务名* @param jobGroupName  任务组名* @param triggerName 触发器名* @param triggerGroupName 触发器组名* @param jobClass  任务* @param cron   时间设置,参考quartz说明文档*/@SuppressWarnings({ "unchecked", "rawtypes" })public void addJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName, Class jobClass, String cron) {try {// 任务名,任务组,任务执行类JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();// 触发器TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器名,触发器组triggerBuilder.withIdentity(triggerName, triggerGroupName);triggerBuilder.startNow();// 触发器时间设定triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 创建Trigger对象CronTrigger trigger = (CronTrigger) triggerBuilder.build();// 调度容器设置JobDetail和Triggerscheduler.scheduleJob(jobDetail, trigger);// 启动if (!scheduler.isShutdown()) {scheduler.start();}} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 修改一个任务的触发时间** @param jobName* @param jobGroupName* @param triggerName 触发器名* @param triggerGroupName 触发器组名* @param cron   时间设置,参考quartz说明文档*/public void modifyJobTime(String jobName,String jobGroupName, String triggerName, String triggerGroupName, String cron) {try {TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);if (trigger == null) {return;}String oldTime = trigger.getCronExpression();if (!oldTime.equalsIgnoreCase(cron)) {/** 方式一 :调用 rescheduleJob 开始 */// 触发器TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器名,触发器组triggerBuilder.withIdentity(triggerName, triggerGroupName);triggerBuilder.startNow();// 触发器时间设定triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 创建Trigger对象trigger = (CronTrigger) triggerBuilder.build();// 方式一 :修改一个任务的触发时间scheduler.rescheduleJob(triggerKey, trigger);/** 方式一 :调用 rescheduleJob 结束 *//** 方式二:先删除,然后在创建一个新的Job  *///JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobName, jobGroupName));//Class<? extends Job> jobClass = jobDetail.getJobClass();//removeJob(jobName, jobGroupName, triggerName, triggerGroupName);//addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);/** 方式二 :先删除,然后在创建一个新的Job */}} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 移除一个任务** @param jobName* @param jobGroupName* @param triggerName* @param triggerGroupName*/public void removeJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName) {try {TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);scheduler.pauseTrigger(triggerKey);// 停止触发器scheduler.unscheduleJob(triggerKey);// 移除触发器scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 删除任务} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description:启动所有定时任务*/public void startJobs() {try {scheduler.start();} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description:关闭所有定时任务*/public void shutdownJobs() {try {if (!scheduler.isShutdown()) {scheduler.shutdown();}} catch (Exception e) {throw new RuntimeException(e);}}public Scheduler getScheduler() {return scheduler;}public void setScheduler(Scheduler scheduler) {this.scheduler = scheduler;}}

 (2)配置一个MySchedule1 的定时任务

/*** @auther: wujj* @date: 2018/8/20 15:02* @description:*/
public class MySchedule1 implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println(new Date() + ": ========job 111111 doing something...");}
}

(3)定时任务起始类

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;import java.util.Date;/*** @auther: wujj* @date: 2018/8/20 15:02* @description:*/
public class MySchedule implements Job {public void doSomething(){System.out.println(new Date() + ": job master Online...");}@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("job doing something...");}}

  

(4)测试类

/*** @auther: wujj* @date: 2018/8/20 15:06* @description:*/
public class testJob {public static void main(String[] args) throws BeansException {ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-quartz.xml");QuartzManager quartzManager = (QuartzManager) ctx.getBean("quartzManager");try {System.out.println("===============【系统启动】===============");Thread.sleep(5000);System.out.println("【增加job1启动】开始(每1秒输出一次)...");quartzManager.addJob("test", "test", "test", "test", MySchedule1.class, "0/1 * * * * ?");Thread.sleep(10000);System.out.println("【修改job1时间】开始(每3秒输出一次)...");quartzManager.modifyJobTime("test", "test", "test", "test", "0/3 * * * * ?");Thread.sleep(20000);System.out.println("【移除job1定时】开始...");quartzManager.removeJob("test", "test", "test", "test");Thread.sleep(5000);System.out.println("【增加job2启动】开始(每1秒输出一次)...");quartzManager.addJob("test", "test", "test", "test", MySchedule1.class, "0/1 * * * * ?");Thread.sleep(15000);// 关掉任务调度容器quartzManager.shutdownJobs();} catch (Exception e) {e.printStackTrace();}}
}

  (5)配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"default-lazy-init="true"><!-- 这个类用来做需要完成的业务--><bean id="mySchedule" class="com.bsoft.homecare.schedule.MySchedule"/><!-- 定时任务 --><bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 调用的类  --><property name="targetObject" ref="mySchedule" /><!-- 调用类中的方法  --><property name="targetMethod" value="doSomething" /><!-- 是否并发  --><property name ="concurrent" value ="false"  /></bean><!-- 定义触发时间 ,这边就不同了,这里必须将时间设置成无限长,因为我们要去读取数据库的时间来做为定时器的触发时间--><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean "><property name="jobDetail" ref="jobtask" /><!-- cron表达式  --><!--每小时执行一次 --><property name="cronExpression" value="0 0 * * * ? *" /></bean><!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序  --><bean id="startQuertz" lazy-init="true" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger" /></list></property></bean><!--这个类是用来设置触发时间的, startJobs方法启动调度容器,然后按照上面触发器每隔1s执行所配置的myJob2.doSomething()方法 --><bean id="quartzManager" class="com.bsoft.homecare.schedule.QuartzManager" lazy-init="false" init-method="startJobs" ><!--这个对象一定要注入,这样类才能进行管理,还有在类型要用get set方法,不然会报错。--><property name="scheduler" ref="startQuertz" /></bean></beans>

  

转载于:https://www.cnblogs.com/tuanz/p/9512371.html

quart动态执行定时任务相关推荐

  1. java获取mysql数据定时执行_详解SpringBoot 创建定时任务(配合数据库动态执行)...

    序言:创建定时任务非常简单,主要有两种创建方式:一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer). 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库 ...

  2. java定时执行sql语句_spring中使用quartz动态添加定时任务执行sql

    系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...

  3. springboot整合Quartz实现动态配置定时任务

    版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/liuchuanhong1/article/details/60873295 前言 在我们日常的开发中,很多 ...

  4. java动态执行逻辑_动态执行代码逻辑

    动态执行逻辑的方法据我所知有一下两种方式 QLExpress Groovy QLExpress QLExpress是阿里开源的动态脚本执行的项目. 由阿里的电商业务规则.表达式(布尔组合).特殊数学公 ...

  5. Springboot定时任务原理及如何动态创建定时任务

    一.前言 上周工作遇到了一个需求,同步多个省份销号数据,解绑微信粉丝.分省定时将销号数据放到SFTP服务器上,我需要开发定时任务去解析文件.因为是多省份,服务器.文件名规则.数据规则都不一定,所以要做 ...

  6. Spring Boot 动态修改定时任务cron参数

    动态修改定时任务cron参数 不需要重启应用就可以动态的改变Cron表达式的值不能使用@Scheduled(cron = "${jobs.cron}")实现 动态定时任务类Dyna ...

  7. django 集成个推_Django动态添加定时任务之djangocelery的使用

    定时任务和周期任务在我们日常工作中应用广泛,例如定时发布.周期巡检等,通常我们会借助Linux下的Crontab来实现,但如何将这一功能搬进我们自研的运维系统呢?借助django-celery即可轻松 ...

  8. ThreadPoolTaskScheduler实现动态管理定时任务

    最近,有个项目有需要用到定时任务,所以做了一个动态管理定时任务的模块.本文将从项目背景.需求.选型.思路.具体实现等方面展开介绍. 背景:有个支付类的项目,中间会产生一些中间态的订单,需要有个定时任务 ...

  9. Celery 动态添加定时任务生产实践

    一.背景 实际工作中会有一些耗时的异步任务需要使用定时调度,比如发送邮件,拉取数据,执行定时脚本 通过celery 实现调度主要思想是 通过引入中间人redis,启动 worker 进行任务执行 ,c ...

最新文章

  1. 一张图搞定iOS学习路线
  2. 为解决Thymeleaf数字格式化问题而想到的几种方案
  3. skywalking链路追踪在微服务架构中的使用
  4. Android之基于xmpp openfire smack开发之Android消息推送技术原理分析和实践[4]
  5. 【渝粤题库】国家开放大学2021春1253C语言程序设计题目
  6. android开机自动开启zram,低内存配置  |  Android 开源项目  |  Android Open Source Project...
  7. 【博客项目】—密码加密( 六)
  8. 大数据安全问题的类型有哪些
  9. Linux 查找进程与结束进程
  10. 适用与IOS手机的python编辑器,让你不限空间,地点都能玩转pyhton代码 !...
  11. 富士施乐3065扫描教程_富士施乐怎么设置扫描到PC
  12. 什么是3C和用户故事 (User Stories)
  13. 5G+北斗高精度定位系统适用于哪些行业领域?
  14. Deadlock found when trying to get lock; try restarting transaction 【MySQL死锁问题解决】
  15. 华为S5700交换机链路聚合配置
  16. 一个大二渣渣准程序员的感动
  17. RMQ与SparseTable(ST表)
  18. Java 8 并发篇 - 冷静分析 Synchronized(上)
  19. 【数据中台】数据质量原因分析
  20. cakephp视图用php文件,CakePHP的视图

热门文章

  1. 1020:打印ASCII码
  2. 使用C++实现DPCM编码(左向预测8bit、4bit、2bit、1bit和上向预测8bit)(更新过)
  3. 【Python1】双系统安装,深度学习环境搭建,目标检测(Tensorflow_API_SSD)
  4. 【机器视觉】 dev_set_lut算子
  5. 【机器视觉】 par_join算子
  6. 程序的不同段的区别和作用
  7. Codeforces 959 E. Mahmoud and Ehab and the xor-MST 思路:找规律题,时间复杂度O(log(n))
  8. WinPcap捕获数据包
  9. 为什么数组是从0开始的
  10. OSTimeTick()函数解析