spring集成quartz

来源:互联网 发布:windows 启动修复文件 编辑:程序博客网 时间:2024/05/24 05:03

     首先,让spring框架运转起来,可以参看一下:http://www.blogjava.net/heyang/archive/2008/11/24/242397.html。 
     1、下载spring、quartz。网址这里就不贴了,网上到处都有,只是要注意一下版本,不同版本spring的web.xml配置不一样。 
     2、把spring配置到工程中,把spring.jar(或者spring-sources.jar)复制到WEB-INF/lib目录下,让系统能找到该类。 
     3、编辑web.xml,把spring的servlet配置到系统,让spring框架能运转起来。配置如下: 
<servlet> 
    <servlet-name>spring</servlet-name> 
    <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>spring</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping> 
     需要注意的是,第3行的内容根据spring的版本不同似乎要有不同配置,我用的是2.5.5版,如果是低版本必须配置成下面这样,两者不能兼容。 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     4、在WEB-INF目录下新建spring的配置文件,同样的因为版本不同默认的配置文件名也不一样,低版本的是:spring-servlet.xml,2.5.5的是:applicationContext.xml。这个文件名也可以不同,可以在web.xml中加入配置: 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring.xml</param-value> 
</context-param> 

     5、根据spring的协议配置xml,让spring 运行起来,这个不属于这篇帖子讨论的内容。 
     然后就是配置quartz了,spring内置了quartz,只要通过简单的配置applicationContext.xml及少量编程就能让quartz在spring框架下运转。quartz的介绍挺多的,这就提两点:一是quartz是任务调度的框架,有两种调度方式:simple和cron模式,simple方式和timertask类似,采用设置interval方式进行调度,而cron可以特有的语法很详细的定制调度执行时间。详细介绍请见http://esffor.iteye.com/blog/96092。另外一点就是注入到quartz框架的任务方式有两种,一种是调用特定方法,这种方法很简单,不要集成quartz的类,可以通过配置文件直接调用的自己编写的类,我用的就是这种方法;另外一种就是继承QuartzJobBean类来完成任务的调度,这种方法虽然复杂了一些,但更灵活,请参看http://ispring.iteye.com/blog/157124。下面是我的步骤: 
     1、quartz内置在spring中,不需要再单独下载,只需要配置applicationContext.xml如下: 
<beans> 
<bean id="firstJob" class="com.mc.job.First"></bean> 
<!--  定义目标bean和bean中的方法  --> 
<bean id="Job" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
     <property name="targetObject"> 
         <ref local="firstJob"/> 
     </property> 
     <property name="targetMethod"> 
<!--  要执行的方法名称  --> 
         <value>Count</value> 
     </property> 
</bean> 
<!--定义触发的时间--> 
<bean id="cron" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
     <property name="jobDetail"> 
     <ref  bean="Job"/> 
     </property> 
     <property name="cronExpression"> 
         <value>0-59 * * * * ?</value> 
     </property> 
</bean> 
<!--  管理触发器  --> 
<bean autowire="no"  class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
     <property name="triggers"> 
     <list> 
         <ref local="cron"/> 
     </list> 
     </property> 
</bean> 
</beans> 
     2、编写自己的类First,如下: 
1package com.mc.job; 

3public class First { 
4    static long Count=0; 
5    public First() 
6    { 
7        System.out.println("Bean initialized."); 
8    } 
9    public void doFirst() 
10    { 
11        Count(); 
12    } 
13    public void Count(){ 
14        Count++; 
15        System.out.print("Count="); 
16        System.out.println(Count); 
17    } 
18} 
     需要说明的有几点: 
     1、自己的First类作为一个bean在spring中生成,并注入到org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类中执行相关方法,需要执行的任务在该方法中实现,我的代码只是输出了一个数字。 
     2、触发时间需要填写表达式,该表达式的格式网上很多,我这就不再说了,程序中是每秒调用一次。 
     3、调试的过程中发现报出了异常,找不到某个类,开始百思不得其解,后来才反应过来,在其他quartz的介绍中提到quartz用到了其他第三方组件,需要注意这些组件与工程自身用到的相同组件间的版本冲突,我的情况正好相反,我没用到哪些组件,所以报出异常,把quartz中相关的jar包复制到lib目录下解决问题。 





SimpleTriggerBean与ScheduledTimerTask类似。你可以用它来指定一个工作应该以怎样的频度运行,以及(可选地)在第一次运行工作之前应该等待多久。例如,要调度报表工作每24小时运行一次,第一次在1小时之后开始运行,可以按照以下方式进行声明: 
Java代码  
<bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
    <property name="jobDetail">  
        <ref bean="reportJob"/>  
    </property>  
    <property name="startDelay">  
        <value>3600000</value>  
    </property>  
    <property name="repeatInterval">  
        <value>86400000</value>  
    </property>  
</bean>  

属性jobDetail装配了将要被调度的工作,在这个例子中是reportJob Bean。属性repeatInterval告诉触发器以怎样的频度运行这个工作(以毫秒作为单位)。这里,我们设置它为86400000,因此每隔24小时它会被触发一次。你也可以选择设置startDelay属性来延迟工作的第一次执行。我们设置它为3600000,因此在第一次触发之前它会等待1小时。 

调度一个cron工作 
尽管你可能认为SimpleTriggerBean适用于大多数应用,但它仍然不能满足发送注册报表邮件的需求。正如ScheduledTimerTask,你只能指定工作执行的频度,而不能准确指定它于何时运行。因此,你无法使用SimpleTriggerBean在每天早晨6:00给课程主任发送注册报表邮件。 

然而,CronTriggerBean允许你更精确地控制任务的运行时间。如果你对Unix的cron工具很熟悉,则会觉得CronTriggerBean很亲切。你不是定义工作的执行频度,而是指定工作的准确运行时间(和日期)。例如,要在每天早上6:00运行报表工作,可以按照以下方式声明一个CronTriggerBean: 
Java代码  
<bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
    <property name="jobDetail">  
        <ref bean="reportJob"/>  
    </property>  
    <property name="cronExpression">  
        <value>0 0 6 * * ?</value>  
    </property>  
</bean>  


和SimpleTriggerBean一样,jobDetail属性告诉触发器调度哪个工作。这里我们又一次装配了一个reportJob Bean。属性cronExpression告诉触发器何时触发。如果你不熟悉cron,这个属性可能看上去有点神秘,因此让我们进一步考察一下这个属性。 

一个cron表达式有至少6个(也可能是7个)由空格分隔的时间元素。从左至右,这些元素的定义如下: 

1.秒(0–59) 

2.分钟(0–59) 

3.小时(0–23) 

4.月份中的日期(1–31) 

5.月份(1–12或JAN–DEC) 

6.星期中的日期(1–7或SUN–SAT) 

7.年份(1970–2099) 

每一个元素都可以显式地规定一个值(如6),一个区间(如9-12),一个列表(如9,11,13)或一个通配符(如*)。“月份中的日期”和“星期中的日期”这两个元素是互斥的,因此应该通过设置一个问号(?)来表明你不想设置的那个字段。表7.1中显示了一些cron表达式的例子和它们的意义: 

表:一些cron表达式的例子 

表   达   式                    意     义 

0 0 10,14,16 * * ?                     每天上午10点,下午2点和下午4点 
0 0,15,30,45 * 1-10 * ?                每月前10天每隔15分钟 
30 0 0 1 1 ? 2012                      在2012年1月1日午夜过30秒时 
0 0 8-5 ? * MON-FRI                    每个工作日的工作时间 

对于cronReportTrigger,我们设置cronExpression为0 0 6 * * ?可以把它读作“在任何月份任何日期(不管是星期几)的6时0分0秒执行触发器。”换句话说,这个触发器会在每天早晨6:00执行。 
使用CronTriggerBean完全能够满足课程主任的期望了。现在剩下要做的只是启动这个工作了。 


启动工作 
Spring的SchedulerFactoryBean是Quartz中与TimerFactoryBean等价的类。按照如下方式在Spring配置文件中声明它: 
Java代码  
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    <property name="triggers">  
        <list>  
            <ref bean="cronReportTrigger"/>  
         </list>  
    </property>  
</bean>  

属性triggers接受一组触发器。由于目前只有一个触发器,因此只需简单地装配一个包含cronReportTrigger Bean的一个引用的列表即可。
原创粉丝点击