Spring的跑批

一. 在企业应用中,我们经常会碰到时间任务调度的需求,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等。Quartz是出了名的任务调度框架,它可以与J2SEJ2EE应用程序相结合,功能灰常强大,轻轻松松就能与Spring集成,使用方便。

二.  Quartz中的概念

主要有三个核心概念:调度器、任务和触发器。三者关系简单来说就是,调度器负责调度各个任务,到了某个时刻或者过了一定时间,触发器触动了,特定任务便启动执行。概念相对应的类和接口有:

1JobDetail:望文生义就是描述任务的相关情况;

2Trigger:描述出发Job执行的时间触发规则。有SimpleTriggerCronTrigger两个子类代表两种方式,一种是每隔多少分钟小时执行,则用SimpleTrigger;另一种是日历相关的重复时间间隔,如每天凌晨,每周星期一运行的话,通过Cron表达式便可定义出复杂的调度方案。

3Scheduler:代表一个Quartz的独立运行容器,TriggerJobDetail要注册到Scheduler中才会生效,也就是让调度器知道有哪些触发器和任务,才能进行按规则进行调度任务。

需要的jar: quartz.jarspring-context-support.jarcommons-collections-3.2.jar

♥创建一个普通的JavaBean  里面定义一个业务逻辑方法

♥配置文件

    SimpleTrigger方式:

--指定我们的业务

 



          --注入业务组件

       

          --指定跑那个方法

       

          --

       

   

         



 --定时器

   

       

       

       

       

       

   
     



   --启动任务调度器

   

       

           

               

           

       

            

       

   

 

CronTrigger的方式配置

  
    
    
        
        
     
        
    

    
        
        
        
    

    
        
            
                
            
        
    

表达式:

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点 
"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触发

     

 

Quartz的配置

名称

必须

类型

默认值

org.quartz.scheduler.instanceName

String

'QuartzScheduler'

org.quartz.scheduler.instanceId

String

'NON_CLUSTERED'

org.quartz.scheduler.instanceIdGenerator.class

String

org.quartz.simpl.SimpleInstanceIdGenerator

org.quartz.scheduler.threadName

String

instanceName+'_QuartzSchedulerThread'

org.quartz.scheduler.idleWaitTime

Long

30000

org.quartz.scheduler.dbFailureRetryInterval

Long

15000

org.quartz.scheduler.classLoadHelper.class

String

org.quaartz.simpl.CascadingClassLoadHelper

org.quartz.context.key.SOME_KEY

String

None

org.quartz.scheduler.userTransactionURL

String

'java:comp/UserTransaction'

org.quartz.scheduler.wrapJobExecutionIn
UserTransaction

Boolean

false

org.quartz.scheduler.jobFactory.class

String

org.quartz.simple.SimpleJobFactory

 

详细解释
·org.quartz.scheduler.instanceName 

每个Scheduler 必须给定一个名称来标识。当在同一个程序中有多个实例时,这个名称作为客户代码识别是哪个 Scheduler 而用。假如你用到了集群特性,你就必须为集群中的每一个实例使用相同的名称,以使它们成为“逻辑上” 是同一个 Scheduler 。

·org.quartz.scheduler.instanceId

每个 Quartz Scheduler 必须指定一个唯一的 ID。这个值可以是任何字符串值,只要对于所有的 Scheduler 是唯一的。如果你想要自动生成的 ID,那你可以使用 AUTO 作为 instanceId 。从版本 1.5.1 开始,你能够定制如何自动生成实例 ID。见 instanceIDGenerator.class 属性,会在接下来讲到。

·org.quartz.scheduler.instanceIdGenerator.class 

从版本1.5.1 开始,这个属性允许你定制instanceId 的生成,这个属性仅被用于属性 org.quartz.scheduler.instanceId设置为 AUTO 的情况下。默认是 org.quartz.simpl.SimpleInstanceIdGenerator ,它会基于主机名和时间戳来产生实例 ID 的。

·org.quartz.scheduler.threadName

可以是对于 Java 线程来说有效名称的任何字符串。假如这个属性未予指定,线程将会接受 Scheduler 名称 (org.quartz.scheduler.instanceName ) 前附加上字符串 '_QuartzSchedulerThread' 作为名称。

·org.quartz.scheduler.idelWaitTime 

这个属性设置了当Scheduler 处于空闲时转而再次查询可用 Trigger 时所等待的毫秒数。通常,你无需调整这个参数,除非你正使用 XA 事物,遇到了 Trigger 本该立即触发而发生延迟的问题。

·org.quartz.scheduler.dbFailureRetryInterval 

这个属性设置Scheduler 在检测到 JobStore 到某处的连接(比如到数据库的连接) 断开后,再次尝试连接所等待的毫秒数。这个参数在使用 RamJobStore 无效。

·org.quartz.scheduler.classLoadHelper.class 

对于多数健状的应用,所使用的默认值为 org.quartz.simpl.CascadingClassLoadHelper 类,它会依序使用其他的ClassLoadHelper 类,直到有一个能正常工作为止。你大概没必须为这个属性指定任何其他的类,除非有可能在应用服务器中时。当前所有可能的 ClassLoadHelper 实现可在 org.quartz.simpl 包中找到。

·org.quartz.context.key.SOME_KEY 

这个属性用于向"Scheduler 上下文" 中置入一个 名-值 对表示的字符串值。(见 Scheduler.getContext() )。因此,比如设置了 org.quartz.context.key.MyEmail = [email protected] 就相当于执行了scheduler.getContext().put("MyEmail", [email protected] 

·org.quartz.scheduler.userTransactionURL 

它设置了Quartz 能在哪里定位到应用服务器的 UserTransaction 管理器的 JNDI URL。默认值(未设定的话) 是java:comp/UserTransaction ,这几乎能工作于所有的应用服务器中。Websphere 用户也许需要设置这个属性为jta/usertransaction 。这个属性仅用于 Quartz 配置使用 JobStoreCMT 的情况,并且org.quartz.scheduler.wrapJobExecutionInUserTransaction 被设定成了 true 。

·org.quartz.scheduler.wrapJobExecutionInUserTransaction 

如果你要Quartz 在调用你的 Job 的 execute 之前启动一个 UserTransaction 的话,设置这个属性为 true 。这个事物将在 Job 的 execute 方法完成和 JobDataMap (假如是一个 StatefulJob ) 更新后提交。默认值为 false 。

·org.quartz.scheduler.jobFactory.class 

这是所用的 JobFactory 的类名称。默认为 org.quartz.simpl.SimpleJobFactory 。你也可以试试org.quartz.simpl.PropertySettingJobFactory 。一个 Job 工厂负责产生 Job 类的实例。SimpleFactory 类是调用 Job 类的 newInstance() 方法。PropertySettingJobFactory 也会调用 newInstance() ,但还会使用 JobDataMap 中的内容以反射方式设置 Job Bean 的属性。

优化的配置:

# Default Properties file for use by StdSchedulerFactory

# to create a Quartz Scheduler Instance, if a different

# properties file is not explicitly specified.

#

##

org.quartz.scheduler.instanceName = DefaultQuartzScheduler

org.quartz.scheduler.rmi.export = false

org.quartz.scheduler.rmi.proxy = false

org.quartz.scheduler.wrapJobExecutionInUserTransaction = false

 

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

org.quartz.threadPool.threadCount = 5

org.quartz.threadPool.threadPriority = 5

org.quartz.scheduler.skipUpdateCheck=true

org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread= true

 

org.quartz.jobStore.misfireThreshold = 60000

 

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

 

 



你可能感兴趣的:(Spring的跑批)