当前位置:编程学习 > JAVA >>

spring quartz 多次调用

早上测试程序的时候,发现项目下的定时任务quartz同一时刻有一个任务执行了两次,但是我清楚地记得原来是没有问题,很是懊恼。
 
第一步
检查配置文件,文件内有配置concurrent为false,理论上来讲应该可以防止job同时执行两次的问题。
[html]  
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:context="http://www.springframework.org/schema/context"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xmlns:aop="http://www.springframework.org/schema/aop"  
       xmlns:tx="http://www.springframework.org/schema/tx"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  
    <!-- 要调用的工作类 -->   
    <bean id="xmlJob" class="com.all58.video.quartz.XmlJob"></bean>  
    <!-- 可继续加新的任务   -->   
    <!-- 要调用的工作类结束 -->    
    <bean id="xmlJobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
        <!-- 调用的类 -->  
        <property name="targetObject">  
            <ref bean="xmlJob"/>  
        </property>  
        <!-- 调用类中的方法 -->  
        <property name="targetMethod">  
            <value>work</value>  
        </property>  
        <span style="color:#ff0000"><property name="concurrent">    
        <value>false</value>    
        </property></span>    
     </bean>  
    <!-- 定义调用对象和调用对象的方法 -->  
     <bean id="xmlJobTaskDoTime" class="org.springframework.scheduling.quartz.CronTriggerBean">  
         <property name="jobDetail">  
             <ref bean="xmlJobTask"/>  
         </property>  
         <property name="cronExpression">  
             <value>0 0/2 * ? * *</value>  
         </property>  
     </bean>  
       
       
     <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序,不需要实例化对象  -->  
     <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
         <property name="triggers">  
             <list>  
                 <ref bean="xmlJobTaskDoTime"/>  
             </list>  
         </property>  
     </bean>  
</beans>  
第二步
既然不是quartz配置的问题,那就往上一层代码找找看吧,忽然发现SSH项目中出现了ApplicationContext被连续两次注入的问题,但是我只是在web.xml进行了一次引用配置,不应该调用两次才对...
[html]  
<!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用,号分隔此参数用于后面的Spring Context Loader -->  
<context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>classpath:applicationContext.xml</param-value>  
</context-param>  
在applicationContext.xml中
[html] 
<bean id="appContext" class="com.all58.video.util.AppContext" />  
 
第三步
虽然不知道什么造成多次注入的问题,但总归知道是什么造成的了,从网上查一下吧  applicationContext.xml多次注入,从网上得来原因,一般的说法是:
 
           在web.xml进行配置applicationConetxt.xml的引用会似使得注入一次,同时spring自己进行加载该文件会使得注入一次。因此造成了两次注入;
 
     既然如此,那我就把quartz的配置提取出来不就可以了,然后我就把quartz的配置写入到了job.xml中,然后更改web.xml文件如下 :       
[html]  
<context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>classpath:applicationContext.xml,<span style="font-family:Tahoma">classpath:job.xml</span></param-value>  
</context-param>  
 理论上来讲应该没问题了吧,但是还是不可以,applicationContext加载两次可以说得过去,但是定时任务还是被同时执行了两次,因此我得出了结果,不是applicationContext.xml被加载了两次,而是web.xml被加载了两次,从而造成了以上的结果。
      那我就去查,什么情况下会出现web.xml被多次加载?
        原来是TOMCAT的配置文件server.xml配置不当引起的
请看下面这段配置就是错误的:
[html] 
 <Host name="localhost" <span style="color:#ff0000"> appBase="webapps"</span>  
            unpackWARs="true" autoDeploy="true"  
            xmlValidation="false" xmlNamespaceAware="false">  
     <span style="color:#3333ff">  <Context path="" docBase="D:\apache-tomcat-6.0.14\webapps\Server" debug="0" reloadable="true"/></span>  
tomcat的默认加载工程目录为tomcat\webapps\....,这就会造成加载一次Server项目下的web.xml   第一次注入
由于本地中的工程有很多,所以为了方便配置了默认启动项目,添加
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,