quartz 定时任务调度管理器
本项目使用的是spring-quartz
以下配置可以开启多个已知定时任务
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> <!--<util:properties id="quartz" location="classpath:quartz.properties" />--> <!-- single thread -->
<task:executor id="threadPoolTaskExecutor" pool-size="1"/> <!-- Scheduler factory bean to glue together jobDetails and triggers to Configure Quartz Scheduler -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory">
<bean class="com.xxx.servicenode.pushtaskserver.quartz.task.MySpringBeanJobFactory"/>
</property>
<property name="startupDelay" value="0"/>
<property name="taskExecutor" ref="threadPoolTaskExecutor"/>
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean> <!-- Run the job every 5 seconds -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myjobDetail"/>
<!--<property name="cronExpression" value="0/5 * * ? * SAT-SUN" />-->
<property name="cronExpression" value="#{config['quartz.time']}"/>
</bean>
<bean id="myjobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.xxx.servicenode.pushtaskserver.quartz.task.MyJob"/>
</bean> </beans>
MySpringBeanJobFactory:
 public class MySpringBeanJobFactory  extends SpringBeanJobFactory {
     @Autowired
     private AutowireCapableBeanFactory autowireCapableBeanFactory;
     @Override
     protected Object createJobInstance(TriggerFiredBundle bundle)throws Exception {
         Object jobInstance = super.createJobInstance(bundle);
         autowireCapableBeanFactory.autowireBean(jobInstance);
         return jobInstance;
     }
 }
MyJob:
 public class MyJob extends QuartzJobBean {
     private final static Logger logger = LoggerFactory.getLogger(MyJob.class);
     @Override
     protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
      //处理自己的业务逻辑
     }
 }
定时任务调度:
适用场景:多个未知定时任务
 public class QuartzManager {
     private final static Logger logger = LoggerFactory.getLogger(QuartzManager.class);
     private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
     private static String JOB_GROUP_NAME = "MY_JOBGROUP_NAME";
     private static String TRIGGER_GROUP_NAME = "MY_TRIGGERGROUP_NAME";
     private static Scheduler scheduler;
     /**
      * 创建一个地上那个会任务并启动
      *
      * @param jobName
      * @param cls
      * @param cron
      * @param messageId
      */
     public static void addJob(String jobName, Class cls, String cron, int messageId, int timingExpId) {
         try {
             Scheduler sched = gSchedulerFactory.getScheduler();
             JobDetail job = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).build();
             JobDataMap jobDataMap = job.getJobDataMap();
             jobDataMap.put("messageId", messageId);
             jobDataMap.put("timingExpId", timingExpId);
             // 表达式调度构建器
             CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
             // 按新的cronExpression表达式构建一个新的trigger
             Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME)
                     .withSchedule(scheduleBuilder).build();
             // 交给scheduler去调度
             sched.scheduleJob(job, trigger);
             // 启动
             if (!sched.isShutdown()) {
                 sched.start();
                 logger.info("新任务创建完毕,并启动 !jobName:[" + jobName + "]");
             }
         } catch (Exception e) {
             String message = e.getMessage();
             if (message.contains("will never fire")) {
                 logger.info("当前任务不会被触发,设置为失效状态,timingExpId:[" + timingExpId + "] ...");
                 PushTaskServerService pushTaskServerService = SpringContextHolder.getInstance().getBean(PushTaskServerService.class);
                 pushTaskServerService.setTimingStatus(timingExpId);
             }
             Throwable cause = e.getCause();
             logger.error("新任务创建、并启动 失败", e);
         }
     }
     /**
      * 移除一个定时任务
      *
      * @param jobName
      */
     public static void removeJob(String jobName) {
         TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME);
         JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME);
         try {
             Scheduler sched = gSchedulerFactory.getScheduler();
             Trigger trigger = (Trigger) sched.getTrigger(triggerKey);
             if (trigger == null) {
                 return;
             }
             // 停止触发器
             sched.pauseTrigger(triggerKey);
             // 移除触发器
             sched.unscheduleJob(triggerKey);
             // 删除任务
             sched.deleteJob(jobKey);
             logger.info("移除任务,完毕!jobName:[" + jobName + "]");
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
     /**
      * 查到当前任务的状态
      *
      * @param jobName
      * @return NONE 无,
      * NORMAL, 正常
      * PAUSED, 暂停
      * COMPLETE, 完成
      * ERROR, 错误,
      * BLOCKED 受阻;
      */
     public static String getTriggerState(String jobName) {
         TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME);
         String name = null;
         try {
             Scheduler sched = gSchedulerFactory.getScheduler();
             Trigger.TriggerState triggerState = sched.getTriggerState(triggerKey);
             name = triggerState.name();
         } catch (Exception e) {
             logger.error("获取任务状态失败!jobName:[" + jobName + "]", e);
         }
         return name;
     }
     /**
      * 暂停一个任务
      *
      * @param jobName
      */
     public static void pauseJob(String jobName) {
         JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME);
         try {
             Scheduler sched = gSchedulerFactory.getScheduler();
             sched.pauseJob(jobKey);
         } catch (Exception e) {
             logger.error("暂停任务失败!jobName:[" + jobName + "]", e);
         }
     }
     /**
      * 恢复一个任务
      *
      * @param jobName
      */
     public static void resumeJob(String jobName) {
         JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME);
         try {
             Scheduler sched = gSchedulerFactory.getScheduler();
             sched.resumeJob(jobKey);
         } catch (SchedulerException e) {
             logger.error("恢复任务失败!jobName:[" + jobName + "]", e);
         }
     }
     /**
      * 获取定时任务调度中全部任务
      */
     public static void getAllJobs() {
         try {
             Scheduler sched = gSchedulerFactory.getScheduler();
             List<String> triggerGroupNames = sched.getTriggerGroupNames();
             logger.info("定时任务管理器中全部任务 . triggerGroupNames.size:[" + triggerGroupNames.size() + "] ... ");
             for (String group : triggerGroupNames) {
                 logger.info("定时任务管理器 TriggerGroupName:[" + group + "] ... ");
                 Set<TriggerKey> triggerKeys = sched.getTriggerKeys(GroupMatcher.triggerGroupEquals(group));
                 logger.info("定时任务管理器[" + group + "]分组下任务size:[" + triggerKeys.size() + "] ... ");
                 for (TriggerKey triggerKey : triggerKeys) {
                     String jobName = triggerKey.getName();
                     logger.info("定时任务管理器[" + group + "]分组下任务Name:[" + jobName + "] ... ");
                     String triggerState = getTriggerState(jobName);
                     logger.info("定时任务管理器[" + group + "]分组下任务Name:[" + jobName + "],任务状态:[" + triggerState + "] ... ");
                 }
             }
         } catch (Exception e) {
             logger.info("获取任务调度管理器中全部任务失败", e);
         }
     }
     /**
      * 开启全部任务
      */
     public static void startJobs() {
         try {
             scheduler.start();
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
     /**
      * 关闭全部任务
      */
     public void shutdownJobs() {
         try {
             if (!scheduler.isShutdown()) {
                 scheduler.shutdown();
             }
         } catch (Exception e) {
             logger.error("关闭全部任务失败", e);
         }
     }
     /**
      * 删除定时任务
      *
      * @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);
         }
     }
     public void startJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) {
         try {
             TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
             Trigger.TriggerState triggerState = scheduler.getTriggerState(triggerKey);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
     /**
      * 创建启动定时任务
      *
      * @param jobClass
      */
     public void createTrgger(Class jobClass) {
         try {
             //定时任务名称
             String jobName = "";
             String triggerName = "";
             String triggerGroupName = "";
             String jobGroupName = "";
             String cron = "";
             JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
             jobDetail.getJobDataMap().put("messageId", "1");
             TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
             // 触发器名,触发器组
             triggerBuilder.withIdentity(triggerName, triggerGroupName);
             triggerBuilder.startNow();
             // 触发器时间设定
             triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
             // 创建Trigger对象
             CronTrigger trigger = (CronTrigger) triggerBuilder.build();
             // 调度容器设置JobDetail和Trigger
             scheduler.scheduleJob(jobDetail, trigger);
             // 启动
             if (!scheduler.isShutdown()) {
                 scheduler.start();
             }
         } catch (Exception e) {
             logger.error("", e);
         }
     }
     public Scheduler getScheduler() {
         return scheduler;
     }
     public void setScheduler(Scheduler scheduler) {
         this.scheduler = scheduler;
     }
 }
经测试:定时任务调度器开启的定时任务,当任务状态为:完成(COMPLETE)时,此任务自动回收
pom.xml(本人是pom版本)
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>
参考文档:http://www.quartz-scheduler.org/documentation/quartz-2.3.0/cookbook/
quartz 定时任务调度管理器的更多相关文章
- 项目一:第十四天  1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出
		1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法 Shiro框架内部整合好缓存管理器, ... 
- Asp.Net Core 轻松学-基于微服务的后台任务调度管理器
		前言 在 Asp.Net Core 中,我们常常使用 System.Threading.Timer 这个定时器去做一些需要长期在后台运行的任务,但是这个定时器在某些场合却不太灵光,而且常常无法 ... 
- 浅谈Quartz定时任务调度
		一 开发概述 对于具有一定规模的大多数企业来说,存在着这样一种需求:存在某个或某些任务,需要系统定期,自动地执行,然而,对大多数企业来说,该技术的实现,却是他们面临的一大难点和挑战. 对于大部分企 ... 
- Quartz 定时任务调度
		一.在Quartz.NET中quartz.properties的配置文件,忽略不修改,考虑下面: var props = new NameValueCollection { { "quart ... 
- 分布式定时任务调度系统技术解决方案(xxl-job、Elastic-job、Saturn)
		1.业务场景 保险人管系统每月工资结算,平安有150万代理人,如何快速的进行工资结算(数据运算型) 保险短信开门红/电商双十一 1000w+短信发送(短时汇聚型) 工作中业务场景非常多,所涉及到的场景 ... 
- .Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统
		一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈. 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理 ... 
- Window服务基于Quartz.Net组件实现定时任务调度(二)
		前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ... 
- C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET还是Hangfire?
		原文由Rector首发于 码友网 之 <C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件有哪些,Timer,FluentScheduler,TaskSchedule ... 
- [源码分析] 定时任务调度框架 Quartz 之 故障切换
		[源码分析] 定时任务调度框架 Quartz 之 故障切换 目录 [源码分析] 定时任务调度框架 Quartz 之 故障切换 0x00 摘要 0x01 基础概念 1.1 分布式 1.1.1 功能方面 ... 
随机推荐
- ntp和chrony
			目录 chrony 简介 ntp pool ntp 配置文件 chrony 配置文件 chronyc 命令行工具 修改时区 chrony 简介 chrony 是 RedHat 开发的,它是网络时间协议 ... 
- 数据库SQL---数据库系统概论
			1.基本术语 1)信息:指数据加工处理后有用的数据. 2)信息的3种世界: (1)现实世界:存在于人脑之外的客观世界. (2)信息世界:现实世界在人脑中的反映. (3)数据世界:将信息世界中的信息通过 ... 
- thinkphp5.0 模型的应用
			<?php namespace app\admin\controller; use app\common\controller\BaseController; use think\Db;//数据 ... 
- 2019-2020-1 20199303 《Linux内核原理与分析》 第十一周作业
			缓冲区溢出漏洞实验 安装一些用于编译C程序的32位软件包 sudo apt-get install -y lib32z1 libc6-dev-i386 sudo apt-get install -y ... 
- 2019-2020-1 20199326《Linux内核原理与分析》第五周作业
			第五周学习内容 庖丁解牛Linux内核分析第四章:系统调用的三层机制(上) Linux内核分析实验四 学到的一些知识 4.1用户态.内核态.中断 宏观上Linux操作系统的体系架构分为用户态和内核态 ... 
- NFS共享设置
			一.安装所需要的软件环境[root@fengling ~]# yum -y install rpcbind nfs-utils二.创建共享目录mkdir /web三.启动服务[root@fenglin ... 
- Linux网络服务第三章远程访问及控制
			1.笔记 655355:端口限制 监听地址:对外提供服务的地址 AllowUsers:仅允许用户登录 DenyUsers:仅禁止用户登录 AllowUsers-用户名-公网地址 ssh/id_rsa. ... 
- Linux 用户管理和提权
			Linux ⽀持多个⼈使⽤同⼀个⽤户登录系统, Windows 在修改组策略的情况下,也可以多个⼈使⽤同⼀个⽤户登录 远程连接Linux的⽅式:SSH协议 远程连接Windows的⽅式:RDP协议 安 ... 
- Centos7下查询jdk安装路径
			今天一个小实验需要安装jdk,用命令java -version查询了一下,原来Centos7自带OpenJDK的环境,但是需要手动配置/etc/profile文件,于是开始找java的安装路径.... ... 
- Effective C++学习记录
			Effective C++算是看完了,但是并没有完全理解,也做不到记住所有,在此记录下55个条款及条款末的"请记住". 让自己习惯C++ 条款01:视C++为一个语言联邦 ① C ... 
