热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

spring3.2.0quartz2.2.1整合实现动态定时任务

2019独角兽企业重金招聘Python工程师标准spring3.2.0quartz-2.2.1实现动态定时任务spring和quartz的整合很简单,但是实现动

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

spring3.2.0 quartz-2.2.1 实现动态定时任务

    spring 和 quartz的整合很简单,但是实现动态定时任务却有一点麻烦,下面详细介绍一下 spring3.2.0和quzrtz2.2.1 的整合 实现定时任务的的动态加载

类介绍

    151419_ocdF_2289161.png

QuartzManager.java   任务的管理(添加、删除、启动、任务列表等),更多功能看官方文档:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/

MyJobFactory.java  job自动注入Spring容器

OverOrderJobExample.java/CloseOrderJobExample.java   job执行内容

源代码

MyJobFactory.java

package chaomeiman.yueshou.job;import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.AdaptableJobFactory;@Configuration("myJobFactory")
public class MyJobFactory extends AdaptableJobFactory{@Autowiredprivate AutowireCapableBeanFactory capableBeanFactory;@Overrideprotected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {//调用父类的方法Object jobInstance = super.createJobInstance(bundle);capableBeanFactory.autowireBeanProperties(jobInstance, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false);return jobInstance;}
}

配置applicationContext.xml

QuartzManager.java

package chaomeiman.yueshou.job;import chaomeiman.yueshou.model.main.JobInfo;
import org.quartz.*;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.context.annotation.Configuration;import static org.quartz.JobBuilder.newJob;@Configuration
public class QuartzManager {/*** 关闭所有定时任务*/public static void shutdownJobs(Scheduler sched) {try {if (! sched.isShutdown()) {sched.shutdown();}} catch (Exception e) {throw new RuntimeException(e);}}/*** 添加任务调度* @param scheduler* @param job* @param classz* @throws SchedulerException*/public void addJob(Scheduler scheduler, JobInfo job, Class classz) throws SchedulerException {TriggerKey triggerKey = TriggerKey.triggerKey(job.getJob_name(), job.getJob_group());CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);if (null == trigger) {//不存在触发器,创建一个JobDetail jobDetail = newJob(classz).withIdentity(job.getJob_name(), job.getJob_group()).build();jobDetail.getJobDataMap().put("jobInfo", job);//表达式调度构建器CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getJob_quartz_time());//按新的cronExpression表达式构建一个新的triggertrigger = TriggerBuilder.newTrigger().withIdentity(job.getJob_name(), job.getJob_group()).withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail, trigger);} else {// Trigger已存在,那么更新相应的定时设置//表达式调度构建器CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getJob_quartz_time());//按新的cronExpression表达式重新构建triggertrigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();//按新的trigger重新设置job执行scheduler.rescheduleJob(triggerKey, trigger);}}/*** 删除任务调度* @param scheduler* @param job* @param classz* @throws SchedulerException*/public void removeJob(Scheduler scheduler, JobInfo job, Class classz) throws SchedulerException {TriggerKey triggerKey = TriggerKey.triggerKey(job.getJob_name(), job.getJob_group());CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);if (null == trigger) {//不存在触发器,创建一个JobDetail jobDetail = newJob(classz).withIdentity(job.getJob_name(), job.getJob_group()).build();jobDetail.getJobDataMap().put("jobInfo", job);//表达式调度构建器CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getJob_time());//按新的cronExpression表达式构建一个新的triggertrigger = TriggerBuilder.newTrigger().withIdentity(job.getJob_name(), job.getJob_group()).withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail, trigger);} else {// Trigger已存在,那么更新相应的定时设置//表达式调度构建器CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getJob_time());//按新的cronExpression表达式重新构建triggertrigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();//按新的trigger重新设置job执行scheduler.rescheduleJob(triggerKey, trigger);}}/*** 获取任务调度列表* @param scheduler* @throws SchedulerException*/public void listJob(Scheduler scheduler) throws SchedulerException {for(String group: scheduler.getJobGroupNames()) {for(JobKey jobKey : scheduler.getJobKeys(GroupMatcher.groupEquals(group))) {System.out.println("Found job identified by: " + jobKey);}}}/*** 启动所有定时任务*/public void startJobs(Scheduler scheduler) {try {scheduler.start();} catch (Exception e) {throw new RuntimeException(e);}}
}

OverOrderJobExample.java

package chaomeiman.yueshou.job;import chaomeiman.yueshou.service.OrderService;
import code.ResultCodeUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import util.LogUtil;public class OverOrderJobExample extends ResultCodeUtil implements Job {@Autowiredprivate OrderService orderService;@Overridepublic void execute(JobExecutionContext arg0) throws JobExecutionException {LogUtil.loger("---------开始执行完成订单任务-------");
// JobDataMap jobDataMap = arg0.getJobDetail().getJobDataMap();if (orderService != null) {try {//自动完成订单//每天零点执行,将支付成功并已接单的订单自动完成orderService.jobOverOrderInfo();} catch (Exception e) {e.printStackTrace();}} else {// TODO: 2017/2/25 获取任务调度信息失败LogUtil.loger("执行完成订单任务失败,orderService获取失败");}LogUtil.loger("---------执行完成订单任务结束-------");}
}

test.java

@Resourceprivate Scheduler scheduler ;public Scheduler getScheduler() {return scheduler;}public void setScheduler(Scheduler scheduler) {this.scheduler = scheduler;}@Testpublic void testJob() throws Exception {String jobTime = "2017-02-27 16:54";DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");LocalDateTime localDateTime = LocalDateTime.parse(jobTime, formatter);int H = localDateTime.getHour();int m = localDateTime.getMinute();int s = localDateTime.getSecond();int d = localDateTime.getDayOfMonth();int M = localDateTime.getMonthValue();int y = localDateTime.getYear();/** 秒 是 0-59 , - * /分 是 0-59 , - * /时 是 0-23 , - * /日 是 1-31 , - * ? / L W C月 是 1-12 或 JAN-DEC , - * /周 是 1-7 或 SUN-SAT , - * ? / L C #年 否 空 或 1970-2099 , - * /**/String jobQuartzTime = s + " " + m + " " + " " + H + " " + d + " " + M + " " + "?" + " " + y;String uuid = UUIDUtil.getUUID();JobInfo jobInfo = new JobInfo();jobInfo.setUuid("a05eb41e833d499b883768ae1f25be69");jobInfo.setUuid2(CoderUtil.encryptMD5(System.currentTimeMillis()+uuid, CoderUtil.ENCODING_FORMAT_UTF_8));jobInfo.setJob_name("201702271437220000000581");jobInfo.setJob_quartz_time(jobQuartzTime);jobInfo.setJob_time("2017-02-27 14:45:00");jobInfo.setJob_group("closeOrder");jobInfo.setOrder_number("201702271437220000000581");jobInfo.setUser_uuid("93cd68fcb95043febd28d6ad86666029");
// jobInfoMapper.insert(jobInfo);QuartzManager quartzManager = new QuartzManager();quartzManager.startJobs(scheduler);quartzManager.addJob(scheduler, jobInfo, CloseOrderJobExample.class);quartzManager.startJobs(scheduler);Thread.sleep(310000);}

结果:

152852_E2QT_2289161.png


转:https://my.oschina.net/u/2289161/blog/849550



推荐阅读
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了如何在 Spring Boot 应用中通过 @PropertySource 注解读取非默认配置文件,包括配置文件的创建、映射类的设计以及确保 Spring 容器能够正确加载这些配置的方法。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
author-avatar
勤奋的瞌睡猪_715
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有