Spring 实现定时作业

31 篇文章 1 订阅

定时批处理作业job是J2EE企业应用里很重要的一环,用来在晚间进行财务挂账,数据传输,计算任务等等操作。

xml配置

<?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"   
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
                http://www.springframework.org/schema/context   
                http://www.springframework.org/schema/context/spring-context-3.0.xsd">  

      <!-- 定义job -->  
    <bean id="jobDetail_1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
        <!-- 注入的service层 -->  
       <property name="targetObject">  
            <ref bean="TSupeviseServiceImpl" />  
       </property>  
           <!-- 调用的方法-->  
       <property name="targetMethod">  
            <value>processTSupervise</value><!-- 处理数据到业务督办表T_Supervise中 -->  
       </property> 
           <!--concurrent为true,则允许一个QuartzJob并发执行,否则就是顺序执行 -->  
          <property name="concurrent" value="false"/>
    </bean>  

      <!-- 定义CronTriggerBean触发器 -->  
    <bean id="cronTrigger_1" class="org.springframework.scheduling.quartz.CronTriggerBean">  
        <!-- 注入需要出发的job -->  
       <property name="jobDetail">  
            <ref bean="jobDetail_1" />  
       </property>  
           <!-- 触发的规则,这里是 每天的凌晨1点触发 -->  
       <property name="cronExpression">  
            <value>0 0 10 * * ? *</value><!-- 每天上午10点执行 -->  
       </property>  
    </bean>  

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
        <property name="triggers">  
            <list>  
                <ref local="cronTrigger_1" />  
            </list>  
        </property>  
    </bean>  

</beans>  

cronExpression表达式解释:

表达式

TablesAre
“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触发

每天早上6点
0 6 * * *

每两个小时
0 /2 * *

晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3

1月1日早上4点
0 4 1 1 *

SchedulerFactoryBean 配置

Quartz 是开源任务调度框架中的翘首,它提供了强大任务调度机制,同时保持了使用的简单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射。此外,Quartz提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。此外,Quartz还提供了组件式的侦听器、各种插件、线程池等功能。

Spring为创建Quartz的Scheduler、Trigger和JobDetail提供了便利的FactoryBean类,以便能够在Spring 容器中享受注入的好处。此外Spring还提供了一些便利工具类直接将Spring中的Bean包装成合法的任务。Spring进一步降低了使用Quartz的难度,能以更具Spring风格的方式使用Quartz。概括来说它提供了两方面的支持:
1. 为Quartz的重要组件类提供更具Bean风格的扩展类;
2. 提供创建Scheduler的BeanFactory类,方便在Spring环境下创建对应的组件对象,并结合Spring容器生命周期进行启动和停止的动作。

配置SchedulerFactoryBean

Quartz的SchedulerFactory是标准的工厂类,不太适合在Spring环境下使用。此外,为了保证Scheduler能够感知Spring容器的生命周期,完成自动启动和关闭的操作,必须让Scheduler和Spring容器的生命周期相关联。以便在Spring容器启动后,Scheduler自动开始工作,而在Spring容器关闭前,自动关闭Scheduler。为此,Spring提供SchedulerFactoryBean,这个FactoryBean大致拥有以下的功能:
1. 以更具Bean风格的方式为Scheduler提供配置信息;
2. 让Scheduler和Spring容器的生命周期建立关联,相生相息;
3. 通过属性配置部分或全部代替Quartz自身的配置文件。
spring容器中的bean只能放到SchedulerContext里面传入job中。

SchedulerFactoryBean属性介绍:

triggers:triggers属性为Trigger[]类型,可以通过该属性注册多个Trigger
calendars:类型为Map,通过该属性向Scheduler注册Calendar;
jobDetails:类型为JobDetail[],通过该属性向Scheduler注册JobDetail;
autoStartup:SchedulerFactoryBean在初始化后是否马上启动Scheduler,默认为true。如果设置为false,需要手工启动Scheduler;
startupDelay:在SchedulerFactoryBean初始化完成后,延迟多少秒启动Scheduler,默认为0,表示马上启动。如果并非马上拥有需要执行的任务,可通过startupDelay属性让Scheduler延迟一小段时间后启动,以便让Spring能够更快初始化容器中剩余的Bean;

SchedulerFactoryBean的一个重要功能是允许你将Quartz配置文件中的信息转移到Spring配置文件中,带来的好处是,配置信息的集中化管理,同时我们不必熟悉多种框架的配置文件结构。回忆一个Spring集成JPA、Hibernate框架,就知道这是Spring在集成第三方框架经常采用的招数之一。SchedulerFactoryBean通过以下属性代替框架的自身配置文件:
dataSource:当需要使用数据库来持久化任务调度数据时,你可以在Quartz中配置数据源,也可以直接在Spring中通过dataSource指定一个Spring管理的数据源。如果指定了该属性,即使quartz.properties中已经定义了数据源,也会被此dataSource覆盖;
transactionManager:可以通过该属性设置一个Spring事务管理器。在设置dataSource时,Spring强烈推荐你使用一个事务管理器,否则数据表锁定可能不能正常工作;
nonTransactionalDataSource:在全局事务的情况下,如果你不希望Scheduler执行化数据操作参与到全局事务中,则可以通过该属性指定数据源。在Spring本地事务的情况下,使用dataSource属性就足够了;
quartzProperties:类型为Properties,允许你在Spring中定义Quartz的属性。其值将覆盖quartz.properties配置文件中的设置,这些属性必须是Quartz能够识别的合法属性,在配置时,你可以需要查看Quartz的相关文档。

参考:
http://blog.csdn.net/hu_shengyang/article/details/19815201
http://www.cnblogs.com/jearay/p/3667906.html
http://blog.sina.com.cn/s/blog_8f329b7b0101pqow.html
http://blog.csdn.net/baolong47/article/details/7912136

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值