首页 > 代码库 > Spring的quartz定时器重复执行二次的问题解决

Spring的quartz定时器重复执行二次的问题解决

Spring的quartz定时器同一时刻重复执行二次的问题解决最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此。打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候,重复启了两个quartz线程。研究下来发现quartz确实会加载两次:第一次:web容器启动的时候,读取applicationContext.xml文件时,会加载一次。第二次:Spring本身会加载applicationContext.xml一次。而我的quartz配置就是写在applicationContext.xml文件里的。解决办法很简单先把quartz配置信息提取出来,单独存成一个文件,比如applicationContext-quartz.xml然后修改web.xml,让web容器启动时,可以加载该文件这样quartz只会在web容器启动时加载一次,Spring不会再加载了。 web.xml配置如下: <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>/WEB-INF/classes/applicationContext.xml,/WEB-INF/classes/applicationContext-timertask.xml</param-value>  </context-param>  <!-- 开启监听 -->  <listener>       <listener-class>           org.springframework.web.context.ContextLoaderListener       </listener-class>   </listener> 把定时器的配置单独写成一个配置文件,在web容器启动的时候只加载一次 这个问题在Spring的TimerTask定时器下也会出现,解决方法也是如此,希望对各位大侠有所帮助----------------------------------------------------------------------------------------------------------------------------参考以上。-----------------------------------------------------------spring-scheduler.xml:<?xmlversion="1.0"encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"      xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"     xmlns:aop="http://www.springframework.org/schema/aop"     xmlns:jpa="http://www.springframework.org/schema/data/jpa"     xsi:schemaLocation="           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd           http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd           http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd           http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"     default-lazy-init="false">    <!-- 任务管理器 -->     <beans>         <!-- 要调用的工作类 -->         <bean id="quartzJob" class="com.xinwei.util.UpdateCurrentValueTask"></bean>         <!-- 定义调用对象和调用对象的方法 多个任务定义多个-->         <bean id="jobtask2"             class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">             <!-- 调用的类 -->             <property name="targetObject">                 <ref bean="quartzJob" />             </property>             <!-- 调用类中的方法 -->             <property name="targetMethod">                 <value>doTask</value>             </property>         </bean>         <!-- 定义触发时间 -->         <bean id="doTime2"             class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">             <property name="jobDetail">                 <ref bean="jobtask2" />             </property>             <!-- cron表达式  每天24:00运行一次 -->            <property name="cronExpression" value=http://www.mamicode.com/"0 0 0 * * ?" />         </bean>         <!-- 总管理类 如果将lazy-init=false那么容器启动就会执行调度程序 -->         <bean id="startQuertz" lazy-init="false" autowire="no"             class="org.springframework.scheduling.quartz.SchedulerFactoryBean">             <property name="triggers">                 <list>                     <ref bean="doTime2"/>                 </list>             </property>         </bean>     </beans></beans>web.xml..<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"     version="2.5">     <display-name>security</display-name>     <context-param>           <param-name>contextConfigLocation</param-name>           <param-value>                classpath*:/applicationContext.xml,                classpath*:/applicationContext-shiro.xml,                classpath*:/spring-scheduler.xml           </param-value>     </context-param>     <listener>          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>     </listener>     <!-- 主要注册request,在普通类中获取request对象 -->     <listener>          <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>     </listener>          <filter>           <filter-name>encodingFilter</filter-name>          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>           <init-param>                <param-name>encoding</param-name>                <param-value>UTF-8</param-value>           </init-param>           <init-param>                <param-name>forceEncoding</param-name>                <param-value>true</param-value>           </init-param>     </filter>     <filter-mapping>           <filter-name>encodingFilter</filter-name>           <url-pattern>/*</url-pattern>     </filter-mapping>     <!-- 过滤参数,将前台传输的参数request. page.去掉 -->      <filter>           <filter-name>ParameterFilter</filter-name>          <filter-class>com.xinwei.filter.ParameterFilter</filter-class>           <init-param>              <param-name>blackListURL</param-name> <!-- 配置黑名单url 表示不走过滤器的url order:1 -->              <param-value>                  /js/**                     /css/**                     /styles/**                     /images/**                     /plugins/**                     /fonts/**                     /login/timeout                     /logout                     /views/**             </param-value>          </init-param>      <init-param>              <param-name>whiteListURL</param-name> <!-- 配置白名单url 表示走过滤器的url order:2-->              <param-value>                  /**             </param-value>          </init-param>      </filter>     <filter-mapping>           <filter-name>ParameterFilter</filter-name>           <url-pattern>/*</url-pattern>     </filter-mapping>                    <!-- pagination filter -->     <filter>           <filter-name>PageFilter</filter-name>          <filter-class>com.xinwei.filter.PageFilter</filter-class>           <init-param>              <param-name>blackListURL</param-name> <!-- 配置黑名单url 表示不走过滤器的url order:1 -->              <param-value></param-value>          </init-param>      <init-param>              <param-name>whiteListURL</param-name> <!-- 配置白名单url 表示走过滤器的url order:2-->              <param-value>                  /**/list             </param-value>          </init-param>      </filter>     <filter-mapping>           <filter-name>PageFilter</filter-name>           <url-pattern>/*</url-pattern>     </filter-mapping>                                   <!-- <filter> <filter-name>openEntityManagerInViewFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>           </filter> <filter-mapping> <filter-name>openEntityManagerInViewFilter</filter-name>           <url-pattern>/*</url-pattern> </filter-mapping> -->     <filter>           <filter-name>shiroFilter</filter-name>          <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>           <init-param>                <param-name>targetFilterLifecycle</param-name>                <param-value>true</param-value>           </init-param>     </filter>     <filter-mapping>           <filter-name>shiroFilter</filter-name>           <url-pattern>/*</url-pattern>     </filter-mapping>     <servlet>           <servlet-name>springServlet</servlet-name>          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>           <init-param>                <param-name>contextConfigLocation</param-name>                <param-value>classpath*:/spring-mvc.xml</param-value>           </init-param>           <init-param>                <param-name>dispatchOptionsRequest</param-name>                <param-value>true</param-value>           </init-param>           <load-on-startup>1</load-on-startup>     </servlet>     <servlet-mapping>           <servlet-name>springServlet</servlet-name>           <url-pattern>/</url-pattern>     </servlet-mapping>          <servlet>    <servlet-name>hessianServlet</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:/server/hessian-server.xml</param-value>    </init-param>    <load-on-startup>1</load-on-startup>      </servlet>           <servlet-mapping>        <servlet-name>hessianServlet</servlet-name>        <url-pattern>/hessian/*</url-pattern>      </servlet-mapping>     <session-config>           <session-timeout>30</session-timeout>     </session-config>     <error-page>           <exception-type>java.lang.Throwable</exception-type>           <location>/WEB-INF/views/error/500.jsp</location>     </error-page>     <error-page>           <error-code>500</error-code>           <location>/WEB-INF/views/error/500.jsp</location>     </error-page>     <error-page>           <error-code>404</error-code>           <location>/WEB-INF/views/error/404.jsp</location>     </error-page>     <error-page>           <error-code>403</error-code>           <location>/WEB-INF/views/error/403.jsp</location>     </error-page></web-app>

 

Spring的quartz定时器重复执行二次的问题解决