背景:项目要求BSS系统与ESOP系统定期进行信息同步,需要启动定时任务。这里简单的运用Spring+Quartz实现定时任务。
以下以信息同步中的集团信息同步简单介绍:
服务类型 | 自动服务名称 | 所属模块 | 每天开始执行时间 | 每天结束执行时间 | 执行频率 | 每次执行耗时 |
信息同步 | 组织架构 | IAP接口 | 0:00:00 | 1:59:59 | 1天 | 30分钟 |
人员信息 | IAP接口 | 0:00:00 | 1:59:59 | 1天 | 30分钟 | |
集团信息 | ESOP接口 | 2:00:00 | 2:59:59 | 1天 | 30分钟 | |
代理商信息 | ESOP接口 | 2:00:00 | 2:59:59 | 1天 | 30分钟 | |
ESOP工单状态 | ESOP接口 | 0:00:00 | 23:59:59 | 5分钟 | 5分钟 |
集团信息要求每天凌晨2点执行。
具体的步骤如下: 1 编写业务类,该类继承了org.springframework.scheduling.quartz.QuartzJobBean,主要的逻辑在executeInternal方法中编写 2 配置spring的applicationContext.xml文件 2.1 配置任务 JobDetailBean 2.2配置触发器 CronTriggerBean 2.3配置调度器 SchedulerFactoryBean 3 所需要的jar包: spring.jar,quartz.jar,commons-logging-1.0.4.jar,commons-dbcp-1.2.2.jar,commons-pool-1.3.jar 4 把quartz.properties放到src类路径下
(一)定义具体的任务调度类
package com.congxing.task.ESOP; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; /** * 集团信息同步任务 * @author Administrator * */ public class GroupCustomerJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { // TODO Auto-generated method stub SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 System.out.println("集团客户信息同步ing..执行时间:"+df.format(new Date()));// new Date()为获取当前系统时间 //TODO } }
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- 集团信息 同步任务 --> <bean id="groupCustomerJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.congxing.task.ESOP.GroupCustomerJob" /> </bean> <!-- 集团信息 同步触发器 --> <bean id="groupCustomerTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="groupCustomerJob"/> <property name="startDelay" value="10000" /> <!-- Cron表达式:每天凌晨2点执行一次--> <property name="cronExpression"> <value>0 0 2 * * ?</value> </property> </bean> <!-- 任务调度器 如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="transactionManager" ref="transactionManager" /> <property name="triggers"> <list> <ref bean="groupCustomerTrigger" /> </list> </property> <property name="quartzProperties"> <map> <entry key="org.quartz.threadPool.threadCount" value="1"/> </map> </property> </bean> </beans>
(四) quartz.properties文件
#============================================================================ # Configure Main Scheduler Properties #============================================================================ org.quartz.scheduler.instanceName = DefaultQuartzScheduler org.quartz.scheduler.instanceId = AUTO org.quartz.scheduler.rmi.export = false org.quartz.scheduler.rmi.proxy = false org.quartz.scheduler.wrapJobExecutionInUserTransaction = false #============================================================================ # Configure ThreadPool #============================================================================ #org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 1 org.quartz.threadPool.threadPriority = 5 #org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true #============================================================================ # Configure JobStore #============================================================================ #org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX #org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate org.quartz.jobStore.misfireThreshold = 60000 #org.quartz.jobStore.useProperties = false #org.quartz.jobStore.tablePrefix = QRTZ_ #org.quartz.jobStore.dataSource = myDS #org.quartz.jobStore.isClustered = true #org.quartz.jobStore.clusterCheckinInterval = 15000 #============================================================================ # Configure DataSource #============================================================================ #org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver #org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost/test #org.quartz.dataSource.myDS.user = root #org.quartz.dataSource.myDS.password = root #org.quartz.dataSource.myDS.maxConnections =10
附录说明:
1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。
字段名 允许的值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日 1-31 , - * ? / L W C
月 1-12 or JAN-DEC , - * /
周几 1-7 or SUN-SAT , - * ? / L C #
年 (可选字段) empty, 1970-2099 , - * /
“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五
2)Cron表达式范例:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?