zoukankan      html  css  js  c++  java
  • 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="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>
  • 相关阅读:
    MySQL "show users"
    MySQL
    A MySQL 'create table' syntax example
    MySQL backup
    MySQL show status
    Tomcat, pathinfo, and servlets
    Servlet forward example
    Servlet redirect example
    Java servlet example
    How to forward from one JSP to another JSP
  • 原文地址:https://www.cnblogs.com/alamps/p/6831131.html
Copyright © 2011-2022 走看看