Spring整合Quartz实现定时任务调度的方法_java

最近项目中需要实现定时执行任务,比如定时计算会员的积分、调用第三方接口等,由于项目采用spring框架,所以这里结合spring框架来介绍。

编写作业类

即普通的pojo,如下:

package com.pcmall.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TaskA {
	private static Logger logger = LoggerFactory.getLogger(TaskA.class);
	public void taskA1(){
		for(int i=0;i<100;i++){
			System.out.println("----A1----" + i);
		}
	}
	public void taskA2(){
		for(int i=0;i<100;i++){
			System.out.println("----A2----" + i);
		}
	}
}

在spring配置文件设置具体的任务

<?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.xsd">

	<bean id="taskA" class="com.pcmall.task.TaskA"></bean>
	<bean id="taskB" class="com.pcmall.task.TaskB"></bean>

	<bean id="taskJobA1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="taskA"></property>
		<property name="targetMethod" value="taskA1"></property>
		<property name="concurrent" value="false"></property>
	</bean>
	<bean id="taskJobA2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="taskA"></property>
		<property name="targetMethod" value="taskA2"></property>
		<property name="concurrent" value="false"></property>
	</bean>
	<bean id="taskJobB1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="taskB"></property>
		<property name="targetMethod" value="taskB1"></property>
		<property name="concurrent" value="false"></property>
	</bean>
	<bean id="taskJobB2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="taskB"></property>
		<property name="targetMethod" value="taskB2"></property>
		<property name="concurrent" value="false"></property>
	</bean>

	<bean id="taskA1Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="taskJobA1" />
		</property>
		<property name="cronExpression">
			<value>0 0/1 * * * ?</value>
		</property>
	</bean>
	<bean id="taskA2Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="taskJobA2" />
		</property>
		<property name="cronExpression">
			<value>0 0/2 * * * ?</value>
		</property>
	</bean>

	<bean id="taskB1Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="taskJobB1" />
		</property>
		<property name="cronExpression">
			<value>0 0/1 * * * ?</value>
		</property>
	</bean>

	<bean id="taskB2Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="taskJobB2" />
		</property>
		<property name="cronExpression">
			<value>0 0/2 * * * ?</value>
		</property>
	</bean>

	<bean id="scheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="taskA1Trigger" />
				<ref bean="taskA2Trigger" />
				<ref bean="taskB1Trigger" />
				<ref bean="taskB2Trigger" />
			</list>
		</property>
	</bean>
</beans>

注意

一个触发器只能触发一个Job,不过一个Job可以有多个Trigger触发,这回带来并发问题。在Quartz中,如果你不想并发执行一个同一个 Job,你可以实现StatefulJob,而不是Job。在Spring中如果使用 MethodInvokingJobDetailFactoryBean,可以通过设置concurrent="false"属性来实现。

尾注

在Spring中使用Quartz而不是单独的一个应用的好处包括:

将所有的任务调度设置放在同一个地方,是任务易于维护。

只对Job编码,Trigger和Scheduler可以通过配置设置

可以使用Pojo Java Bean执行job,而无需实现Job接口

Cron表达式的详细用法

字段 允许值 允许的特殊字符

秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选)留空, 1970-2099 , - * /

例子:

0/5 * * * * ? : 每5秒执行一次

“”字符被用来指定所有的值。如:""在分钟的字段域里表示“每分钟”。

“?”字符只在日期域和星期域中使用。它被用来指定“非明确的值”。当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。看下面的例子你就会明白。

月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号来表明不想设置那个字段。

“-”字符被用来指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”。

“,”字符被用来指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”。

“/”字符用于指定增量。如:“0/15”在秒域意思是每分钟的0,15,30和45秒。“5/15”在分钟域表示每小时的5,20,35和50。符号“”在“/”前面(如:/10)等价于0在“/”前面(如:0/10)。记住一条本质:表达式的每个数值域都是一个有最大值和最小值的集合,如:秒域和分钟域的集合是0-59,日期域是 1-31,月份域是1-12。字符“/”可以帮助你在每个字符域中取相应的数值。如:“7/6”在月份域的时候只有当7月的时候才会触发,并不是表示每个 6月。

L是‘last'的省略写法可以表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of- month域中表示一个月的最后一天。如果在day-of-week域表示‘7'或者‘SAT',如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如‘6L'就表示一个月的最后一个星期五。

字符“W”只允许日期域出现。这个字符用于指定日期的最近工作日。例如:如果你在日期域中写 “15W”,表示:这个月15号最近的工作日。所以,如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发。如果是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。字符“W”只能配合一个单独的数值使用,不能够是一个数字段,如:1-15W是错误的。

“L”和“W”可以在日期域中联合使用,LW表示这个月最后一周的工作日。

字符“#”只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。“2#1”表示本月第一周的星期一。“4#5”表示第五周的星期三。

字符“C”允许在日期域和星期域出现。这个字符依靠一个指定的“日历”。也就是说这个表达式的值依赖于相关的“日历”的计算结果,如果没有“日历” 关联,则等价于所有包含的“日历”。如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历” 中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)。

表达式举例

"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

以上这篇Spring整合Quartz实现定时任务调度的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索spring
, quartz
整合
定时调度 quartz、spring定时器quartz、spring定时任务quartz、spring与quartz定时器、quartz spring 整合,以便于您获取更多的相关知识。

时间: 2025-01-31 10:49:12

Spring整合Quartz实现定时任务调度的方法_java的相关文章

spring学习笔记(25)spring整合quartz多版本实现企业级任务调度

在我们的另一个专栏<深入浅出Quartz任务调度>详细的讲解了使用Quartz适用于从普通门户至网站企业级系统的任务调度实现方法.在下面我们结合实例来完整spring和quartz的整合工作,将我们对quartz的配置统一交给spring容器进行管理.quartz1与quartz2两个版本的差别较大,他们的具体差别可参考我的另一篇文章Quartz任务调度(1)概念例析快速入门.鉴于我们的实际项目中很多依旧使用着quartz1版本,下面我们会针对quartz1和quartz2的配置分别进行分析.

项目ITP(六) spring4.0 整合 Quartz 实现动态任务调度

正文  spring4.0 整合 Quartz 实现任务调度.这真是期末项目的最后一篇,剩下到暑假吧.    Quartz 介绍   Quartz is a full-featured, open source job scheduling service that can be integrated with, or used along side virtually any Java application - from the smallest stand-alone applicatio

java实现Spring在XML配置java类的方法_java

1. 创建自己的bean文件:beans.xml <?xml version="1.0" encoding="UTF-8"?> <busi-beans> <beans> <bean id="SysHelloImpl" type="com.cxm.test.SysHello"> <desc>test</desc> <impl-class>com.

Spring 整合Quartz 2实现定时任务四:细化调整及一些已知的问题

之前已经把功能基本都实现了,这里我们再来优化一下代码. 我们发现,在创建.修改.和删除定时任务时,对于quartz的操作其实是可以封装成一个简单的工具辅助类的,如创建的代码可以抽取成: /** * 创建定时任务 * * @param scheduler the scheduler * @param jobName the job name * @param jobGroup the job group * @param cronExpression the cron expression * @

Spring 整合Quartz 2实现定时任务五:集群、分布式架构实现探讨

到这里,功能上我们已经全实现了. 但是有时候我们的项目不是部署在一台机器上的,而是一个集群环境,往往我们的定时任务只需要一台机器执行就够了. 那么我们怎么样来实现这种集群环境下的定时任务运行呢? 前面说的支持幂等性可以在一定程序上解决这个问题,网上有版本使用数据库加锁的方式也可以,当然,还可以借助zookeeper等方式来实现更强大的分布式锁. 我在这里主要说的方式并不直接涉及到这个集群的问题,而是讨论这个定时任务运行的架构该如何来搭建,当然集群问题将自然而然得到解决. 在我的思维中,定时任务的

spring学习笔记(26)spring整合Quartz2持久化稳健任务调度

在<Quartz任务调度(3)存储与持久化操作配置详细解析 >一文中,我们通过配置quartz.properties属性文件实现了Quartz的数据库持久化操作.现在整合spring的原理,就是相当于把我们在属性文件中的配置属性整合进SchedulerFactoryBean中,来生成我们的Scheduler类. 这里需要特别注意的是,我们通过Bean配置生成的JobDetail和CronTrigger或SimpleTrigger不能被序列化,因而不能持久化到数据库中,如果想要使用持久化任务调度

Spring整合Quartz 疑问

问题描述 spring配置:<beanid="workLoadSchedule"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><propertyname="triggers"><list><refbean="workLoadTrigger"/></list></propert

java实现电脑定时关机的方法_java

本文实例讲述了java如何注册成windows服务程序及一个简单的java定时关机程序代码,分享给大家供大家参考.具体方法如下: 一.问题: 最近想找个软件来控制电脑的关机时间,在网上找了几个,都是可视化界面的可以设置具体的关机时间的软件.由于我想编写的关机程序是运行在别人机器上,只能让该机器在晚上17 点到23 点25 分才上网,到了23 点25 分就可以自动关机.为了让别人感觉不到这个软件的"存在"(免得使用者自己关闭定时关机软件),所以我想把关机软件注册为服务的方式,运行在后台.

Java Web项目中Spring框架处理JSON格式数据的方法_java

json是一种常见的传递格式,是一种键值对应的格式.并且数据大小会比较小,方便传递.所以在开发中经常会用到json. 首先看一下json的格式: {key1:value1,key2:value2} 每一个建对应一个值,每个键值对之间用逗号连接.并且最后一个键值对之后没有逗号,整体需要有大括号括起来. 一般正常的servlet返回json时,会像下面这样: response.setContentType("text/JSON;charset=utf-8"); response.getWr