javaspring和quartz

     这两天一直琢磨着学学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框架能运转起来。配置如下:

1<servlet>
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>
     需要注意的是,第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可以特有的语法很详细的定制调度执行时间。详细介绍请见《Spring使用Quartz配置调度事务》。另外一点就是注入到quartz框架的任务方式有两种,一种是调用特定方法,这种方法很简单,不要集成quartz的类,可以通过配置文件直接调用的自己编写的类,我用的就是这种方法;另外一种就是继承QuartzJobBean类来完成任务的调度,这种方法虽然复杂了一些,但更灵活,请参看《在Spring中使用Quartz调度器》。下面是我的步骤:

     1、quartz内置在spring中,不需要再单独下载,只需要配置applicationContext.xml如下:

 1 <beans>
 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,如下:

 1package com.mc.job;
 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目录下解决问题。

原文地址:https://www.cnblogs.com/badwood316/p/1401089.html