SpringMVC 项目中 Quartz 定时任务的设置纪要

项目使用的是SpringMVC, 以前就已经集成了 1.x 版本的 Quartz,有专门的配置文件定义了需要的bean。

一、配置文件示例如下:

<?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:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"
        >
        
	<!-- 定时装置所要执行的任务所在的类 -->
    <bean id="xxxJob" class="XXX"/>
    
	<!-- 引用任务描述 -->
    <bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
       <property name="targetObject">
		   
		   <!-- 引用任务方法所在的类 -->
           <ref bean="xxxJob" />
       </property>
       <property name="targetMethod">
           
		   <!-- 指定任务方法名称 -->
		   <value>xxxMenthod</value>
       </property>
    </bean>
    
    <!-- 配置触发器 -->
    <bean id="xxxTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
       <!-- 这里不可以直接在属性jobDetail中引用taskJob,因为他要求的是一个jobDetail类型的对象,所以我们得通过MethodInvokingJobDetailFactoryBean来转一下 -->
       <property name="jobDetail">
	   
		   <!-- 引用任务描述bean -->
           <ref bean="methodInvokingJobDetail" />
       </property>
	   
       <!-- 每天的8点到21点每隔1分钟触发,具体说明见附录 -->
       <property name="cronExpression">
	   
		   <!-- 秒 分 时 日 月 周 年 -->
           <value>0 0 07,12,15,23 * * ?</value>
       </property>
    </bean>
 
	<!-- 配置任务工厂, 只能有一个这种bean -->
    <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
       
	   <!-- 添加触发器 -->
       <property name="triggers">
           <list>
              <ref local="xxxTrigger" />
			  <!-- ... -->
           </list>
       </property>
    </bean>
</beans>

注意:schedulerFactory 只能定义一个,不然在工程启动的时候会报错。

二、实现程序对定时任务执行的控制

目前拟实现一个控制定时任务执行的服务类,供控制层调用,包括对运行中的Quartz中触发器的增、删和修改。

在这个服务类中,可以通过依赖注入注解拿到配置好的 SchedulerFactoryBean 和 触发器bean,例如:

@Autowired
SchedulerFactoryBean schedulerFactory;

@Autowired
CronTriggerBean xxxTrigger;

拿到 SchedulerFactoryBean 的 bean 以后,就可以借此获得获得 Scheduler 对象 scheduler :

Scheduler scheduler = schedulerFactory.getScheduler();

通过 scheduler 可以取消和新增任务计划的触发器了:

try {
	scheduler.unscheduleJob("xxxTrigger", Scheduler.DEFAULT_GROUP);
} catch (SchedulerException e) {
	e.printStackTrace();
}
try {
	String newExpression = "5/1 * * * * ?";
	xxxTrigger.setCronExpression(newExpression);
	scheduler.scheduleJob(xxxTrigger);
} catch (SchedulerException e) {
	e.printStackTrace();
} catch (ParseException e) {
	e.printStackTrace();
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

MySQL存储日志并使用Loganalyzer作为前端展示

为什么要使用日志 在生产环境中我们可能需要一个较为完整的日志系统来查看运行中主机服务的状态和所作出的操作,我们可以在较大型的网络架构中使用ELK来实现对日志的收...

34290
来自专栏乐沙弥的世界

MHA 清理relay log(purge_relay_logs)

    MySQL数据库主从复制在缺省情况下从库的relay logs会在SQL线程执行完毕后被自动删除,但是对于MHA场景下,对于某些滞后从库的恢复依赖于其他...

17000
来自专栏互扯程序

spring Boot 整合mybatis 如何使用多数据源

前言 本篇教程偏向实战,程序猿直接copy代码加入到自己的项目中做简单的修修改改便可使用,而对于springboot以及mybatis不在此进行展开介绍...

45490
来自专栏三杯水

ELKB5.2.2集群环境部署配置优化终极文档

3,logstash filter 加入urldecode支持url、reffer、agent中文显示

37020
来自专栏Hadoop实操

使用Hue创建Ssh的Oozie工作流时重定向输出日志报错分析

Fayson前面的一篇文章讲过《如何在Hue中创建Ssh的Oozie工作流》。但当重定向输出日志时,会出现异常。

46790
来自专栏PHP在线

重磅资料!Github上的PHP资源汇总大全

依赖管理 ——用于依赖管理的包和框架 Composer/Packagist : 一个包和依赖管理器 Composer Installers: 一个多框架Com...

32540
来自专栏乐沙弥的世界

基于Innobackupex的完全恢复

    对于MySQL的完全恢复,我们可以借助于Innobackupex的多重备份加上binlog来将数据库恢复到故障点。这里的完全恢复是相对于时点恢复(也叫...

15120
来自专栏实战docker

pinpoint插件开发之一:牛刀小试,调整gson插件

从本章开始我们一起来实战pinpoint插件开发,做一些实用的pinpoint插件,本着先易后难的原则,我们从修改现有插件开始吧; 准备工作 本次实战的操作环境...

35550
来自专栏ChaMd5安全团队

CVE-2018-1000156:GNU Patch任意代码执行漏洞分析

GNU Patch 源码下载地址:https://ftp.gnu.org/gnu/patch/

29720
来自专栏Hadoop实操

如何在Redhat7.4安装CDH6.0

Cloudera在前天8月30日,对外宣布正式发布Cloudera Enterprise 6,相关介绍可以参考Fayson昨天的文章《Cloudera Ente...

2K60

扫码关注云+社区

领取腾讯云代金券