spring结合quartz的定时的2种方式
1、 Spring 的org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类,使用此方法使开发人员对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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- 方法一: Spring 的org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类, 使用此方法使开发人员对Quartz完全透明,需要实现定时任务的方法只是一个普通方法。 --> <!--1、 配置文件中添加业务类,该类为调用的工作类 --> <bean id="businessWork" class="com.morningstar.quartz.BusinessWork" /> <!-- 2、定义任务,在spring文件中配置代理类 ,定义调用对象和调用对象的方法--> <bean id="businessTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 调用的类 --> <property name="targetObject" ref="businessWork"/> <!-- 调用类中的方法 --> <property name="targetMethod" value="generateReport"/> <!-- false,证明不执行并发任务 --> <property name="concurrent" value="false"/> </bean> <!-- 3、配置触发器,定义触发时间,可以根据不同的时间对同一个任务定义多个触发器,下面是每隔5秒调用一个方法配置--> <!-- cron表达式 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="businessTask"/> <property name="cronExpression" value="10,15,20,25,30,35,40,45,50,55 * * * * ?"/> </bean> <!-- 4、配置调度器 ,容器启动就会执行调度程序 --> <!-- 总管理类,如果lazy-init=‘false‘,则容器启动时就会执行调度程序--> <!-- 如果lazy-init=‘true‘,则需要实例化该bean才能执行调度程序 --> <bean id="schdulerFactory" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean> </beans>
2、借助于Spring的org.springframework.scheduling.quartz.JobDetailBean的类功能, 继承 Spring封装Quartz的org.springframework.scheduling.quartz.QuartzJobBean类,实现 executeInternal方法,executeInternal方法中调用业务类。
<?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-2.5.xsd"> <!-- 方法二: 借助于Spring的org.springframework.scheduling.quartz.JobDetailBean的类功能, 继承 Spring封装Quartz的org.springframework.scheduling.quartz.QuartzJobBean类,实现 executeInternal方法, executeInternal方法中调用业务类 --> <!-- 1、定义任务,在spring文件中配置代理类 ,定义调用对象和调用对象的方法--> <bean id="businessTask" class="org.springframework.scheduling.quartz.JobDetailBean"> <!-- 调用的类 --> <property name="jobClass" value="com.morningstar.quartz.BusinessWork"/> <!-- 主要是为了在定时任务需要使用到Bean,通过Spring给注入进来,如果不写明,就会报java.lang.NullPointerException错误 --> <!-- <property name="jobDataAsMap"> <map> <entry key="someService"> <ref bean="someService" /> </entry> </map> </property> --> </bean> <!-- 2、配置触发器,定义触发时间,可以根据不同的时间对同一个任务定义多个触发器--> <!-- cron表达式 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="businessTask"/> <property name="cronExpression" value="10,15,20,25,30,35,40,45,50,55 * * * * ?"/> </bean> <!-- 3、配置调度器 ,容器启动就会执行调度程序 --> <!-- 总管理类,如果lazy-init=‘false‘,则容器启动时就会执行调度程序--> <!-- 如果lazy-init=‘true‘,则需要实例化该bean才能执行调度程序 --> <bean id="schdulerFactory" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean> </beans>
1)为Quartz的重要组件类提供更具Bean风格的扩展类;
2)提供创建Scheduler的BeanFactory类,方便在Spring环境下创建对应的组件对象,并结合Spring容器生命周期进行启动和停止的动作。
关于JobDetail, Spring通过扩展JobDetail提供了一个JobDetailBean(org.springframework.scheduling.quartz包里)。JobDetailBean可以配置以下属性,其任务类如果实现了org.quartz.Job,则jobDataAsMap的值的修改无法保留到下一次执行,如果实现了org.quartz.StatefulJob:
● beanName:默认为Bean的id名,通过该属性显式指定Bean名称,它对应任务的名称;
● jobDataAsMap:类型为Map,为任务所对应的JobDataMap提供值。Spring通过jobDataAsMap设置JobDataMap的值;
● applicationContextJobDataKey:你可以将Spring ApplicationContext的引用保存到JobDataMap中,以便在Job的代码中访 问ApplicationContext。为了达到这个目的,你需要指定一个键,用以在jobDataAsMap中保存ApplicationContext,如果不设置此键,JobDetailBean就不将ApplicationContext放入到JobDataMap中。
● jobListenerNames:类型为String[],指定注册在Scheduler中的JobListeners名称,以便让这些监听器对本任务的事件进行监听。
域名 |
强制? |
允许值范围 |
支持的特殊字符 |
秒 |
是 |
0-59 |
- * / |
分 |
是 |
0-59 |
- * / |
时 |
是 |
0-23 |
- * / |
日 |
是 |
1-31 |
- * / ? L W C |
月 |
是 |
1-12 |
- * / |
星期 |
是 |
1-7(SUN-SAT) |
- * / ? L C # |
年 |
非空 |
1970-2099 |
- * / |
● dataSource:当需要使用数据库来持久化任务调度数据时,你可以在Quartz中配置数据源,也可以直接在Spring中通过dataSource指定一个Spring管理的数据源。如果指定了该属性,即使quartz.properties中已经定义了数据源,也会被此dataSource覆盖;
● transactionManager:可以通过该属性设置一个Spring事务管理器。在设置dataSource时,Spring强烈推荐你使用一个事务管理器,否则数据表锁定可能不能正常工作;
● nonTransactionalDataSource:在全局事务的情况下,如果你不希望Scheduler执行化数据操作参与到全局事务中,则可以通过该属性指定数据源。在Spring本地事务的情况下,使用dataSource属性就足够了;
● quartzProperties:类型为Properties,允许你在Spring中定义Quartz的属性。其值将覆盖quartz.properties配置文件中的设置,这些属性必须是Quartz能够识别的合法属性,配置quartzProperties属性实例如下:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。