这两天一直琢磨着学学spring和quartz,主要是为了能写一个贴合自己需要的监控程序。同时也熟悉一下系统用到的技术。其中绕了不少弯路,昨晚弄到1点多,都没搞定,今天终于算是整出了hello world。由于我用的是eclipse,所以spring需要自己配置,如果是myeclipse,那基本上不用看我的帖子了。
首先,让spring框架运转起来,可以参看一下:《Spring在Web应用中的配置》。
1、下载spring、quartz。网址这里就不贴了,网上到处都有,只是要注意一下版本,不同版本spring的web.xml配置不一样。
2、把spring配置到工程中,把spring.jar(或者spring-sources.jar)复制到WEB-INF/lib目录下,让系统能找到该类。
3、编辑web.xml,把spring的servlet配置到系统,让spring框架能运转起来。配置如下:
2 <servlet-name>spring</servlet-name>
3 <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
4 <load-on-startup>1</load-on-startup>
5</servlet>
6<servlet-mapping>
7 <servlet-name>spring</servlet-name>
8 <url-pattern>*.do</url-pattern>
9</servlet-mapping>
4、在WEB-INF目录下新建spring的配置文件,同样的因为版本不同默认的配置文件名也不一样,低版本的是:spring-servlet.xml,2.5.5的是:applicationContext.xml。这个文件名也可以不同,可以在web.xml中加入配置:
<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可以特有的语法很详细的定制调度执行时间。详细介绍请见《Spring使用Quartz配置调度事务》。另外一点就是注入到quartz框架的任务方式有两种,一种是调用特定方法,这种方法很简单,不要集成quartz的类,可以通过配置文件直接调用的自己编写的类,我用的就是这种方法;另外一种就是继承QuartzJobBean类来完成任务的调度,这种方法虽然复杂了一些,但更灵活,请参看《在Spring中使用Quartz调度器》。下面是我的步骤:
1、quartz内置在spring中,不需要再单独下载,只需要配置applicationContext.xml如下:
2 <bean id="firstJob" class="com.mc.job.First"></bean>
3 <!-- 定义目标bean和bean中的方法 -->
4 <bean id="Job" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
5 <property name="targetObject">
6 <ref local="firstJob"/>
7 </property>
8 <property name="targetMethod">
9 <!-- 要执行的方法名称 -->
10 <value>Count</value>
11 </property>
12 </bean>
13 <!--定义触发的时间-->
14 <bean id="cron" class="org.springframework.scheduling.quartz.CronTriggerBean">
15 <property name="jobDetail">
16 <ref bean="Job"/>
17 </property>
18 <property name="cronExpression">
19 <value>0-59 * * * * ?</value>
20 </property>
21 </bean>
22 <!-- 管理触发器 -->
23 <bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
24 <property name="triggers">
25 <list>
26 <ref local="cron"/>
27 </list>
28 </property>
29 </bean>
30 </beans>
2、编写自己的类First,如下:
2
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目录下解决问题。