• 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>
  • 相关阅读:
    2019 SDN上机第1次作业
    关键路径法(Critical Path Method, CPM)
    iOS 一个项目添加多个TARGET
    为图形处理器提供数据
    OpenGL全流程详细解读
    小技巧之padding-bottom实现等比例图片缩放
    Mac 显示隐藏文件
    mac 下修改 jenkins 端口以及Jenkins的启动、关闭与更新
    Mac上Charles抓包iOS的https请求
    python自动循环重启android系统
  • 原文地址:https://www.cnblogs.com/alamps/p/6831131.html
Copyright © 2020-2023  润新知