zoukankan      html  css  js  c++  java
  • spring定时任务配置,以及不执行的解决办法

    前几天,同事问了我一个问题,我告诉他用spring的定时任务解决,并给他配置了spring的定时任务。当时随便找了一个bean写了一段代码,验证定时任务正确执行后,就没再管,昨天下午,同事写代码的时候,把这段代码移到了自己特定的bean中。问题就来了,定时任务不执行了。我给他把代码的位置又换回之前的那个bean中。又可以执行。。

    弄了老半天,终于解决了。原来是spring延迟加载的问题。

    spring 定时任务的配置:

    spring3.0后,引入了注解,因此配置显得很方便。只要配置好配置文件的命名空间,然后直接在代码中使用注解即可!

    首先,配置文件的schema要加上 这两句:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. http://www.springframework.org/schema/task  
    2. http://www.springframework.org/schema/task/spring-task-3.1.xsd  

    然后,配置namespace的别名:
    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. xmlns:task="http://www.springframework.org/schema/task"  


    配置文件的头部,就配置好了。

    然后是,打开定时器的开关:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <task:annotation-driven/>  
    这样。spring就可以根据注解扫描这些bean,然后检查注解代码了。

    执行定时的代码:

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. @Scheduled(cron="0/5 * *  * * ? ")  
    2. public void schetest(){  
    3.    System.out.println("scheduled invoke!");  
    4. }  

    每隔五秒执行一次。

    正常的配置应该如上。但是昨天却出了问题。把这个代码写到某个类中就没问题,写到这个包下面的同样别的bean中就不执行了。 后来去网上搜了一下,一篇文章说道:要顺利执行定时任务,执行这段代码的bean,不能使延迟加载而来的。 即 不能是default-lazy-init="true"。我看了一下,配置文件,发现这个文件beans 节点中,赫然写着default-lazy-init="true" 于是问题找到了。 这样写的目的是,加快启动时间,启动的时候,对bean的加载延迟。但是有错误却无法即使显现了。 因为配置文件是搭环境时配置好的。因此不便改动。因此采用别的办法,手动 配置这个bean不再延迟加载,即在这个bean上 加上:

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. @Lazy(false)  

    这样,这个类就不再是延迟加载了。定时任务写在他里面,也正常执行了。

    问题解决了。但我还有一个疑问:为什么,我在同一个包下面,把代码写到某些类中,他可以执行,写到某些类中却不可以执行呢? 仔细看了一遍那边配置文件,发现有一段代码:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <bean id="methodCachePointCut"  
    2.         class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  
    3.         <property name="advice">  
    4.             <ref local="methodCacheInterceptor" />  
    5.         </property>  
    6.         <property name="patterns">  
    7.             <list>  
    8.                 <!--  
    9.                 <value>com.xajob.service.AdvertisService.getAll</value>  
    10.                 <value>com.xajob.service.LinksService.getAll</value>  
    11.                 <value>com.xajob.service.CompanyService.getFamousCompanies</value>  
    12.                 <value>execution(com.xajob.service.JobService.getByIndustr*(..))</value>  
    13.                 <value>execution(com.xajob.service.CompanyService.getByIndustr*(..))</value>  
    14.                 <value>execution(com.xajob.service.CompanyService.getGraduate*(..))</value>  
    15.                 <value>execution(com.xajob.service.JobService.getGraduate*(..))</value>  
    16.                 <value>execution(com.xajob.service.JobService.countByIndustr*(..))</value>  
    17.                 <value>execution(com.xajob.service.PersonService.getNew*(..))</value>  
    18.                 <value>execution(com.xajob.service.JobService.getNew*(..))</value>  
    19.                 <value>execution(com.xajob.service.CompanyService.getNew*(..))</value>  
    20.                 <value>execution(com.xajob.service.ArticleService.get*(..))</value>  
    21.                 <value>execution(com.xajob.service.ArticleService.page*(..))</value>  
    22.                 <value>execution(com.xajob.service.ArticleService.group*(..))</value>  
    23.                 <value>com.xajob.service.JobService.pageHighLevelJob</value>  
    24.                 <value>execution(com.xajob.service.JobService.getTop*(..))</value>  
    25.                 <value>execution(com.xajob.service.SpecialCompanyService.get*(..))</value>  
    26.                   -->  
    27.                   
    28.                 <value>com.xajob.service.LinksService.getAll</value>  
    29.                 <value>com.xajob.service.AdvertisService.getAll</value>  
    30.                 <value>.*getFamousCompanies</value>  
    31.                 <value>.*getNewPerson</value>  
    32.                 <value>.*getNew5Job</value>  
    33.                 <value>.*getNew5Urgent</value>  
    34.                 <value>.*getNewCompany</value>  
    35.                 <value>.*getTop20HighLevelJob</value>  
    36.                 <value>com.xajob.service.SpecialCompanyService.*</value>  
    37.                 <value>com.xajob.service.ArticleService.getByType</value>  
    38.                 <value>com.xajob.service.ArticleService.pageByType</value>  
    39.                 <value>com.xajob.service.ArticleService.getTopTen</value>  
    40.                 <value>com.xajob.service.ArticleService.getNewEight</value>  
    41.                 <value>com.xajob.service.ArticleService.getImgNews</value>  
    42.                 <value>com.xajob.service.ArticleService.groupByType</value>  
    43.             </list>  
    44.         </property>  
    45.     </bean>  
    46.       
    47.     <bean id="cacheAdvertisService"  
    48.         class="com.xajob.service.AdvertisService">  
    49.     </bean>  
    50.     <bean id="cacheLinksService"  
    51.         class="com.xajob.service.LinksService">  
    52.     </bean>  
    53.     <bean id="cacheArticleService"  
    54.         class="com.xajob.service.ArticleService">  
    55.     </bean>  
    56.     <bean id="cacheCompanyService"  
    57.         class="com.xajob.service.CompanyService">  
    58.     </bean>  
    59.     <bean id="cacheJobService"  
    60.         class="com.xajob.service.JobService">  
    61.     </bean>  
    62.     <bean id="cacheSpecialCompanyService"  
    63.         class="com.xajob.service.SpecialCompanyService">  
    64.     </bean>  
    65.     <bean id="cachePersonService"  
    66.         class="com.xajob.service.PersonService">  
    67.     </bean>  
    68.   
    69.     <bean id="cacheAdvertisInterceptor" class="org.springframework.aop.framework.ProxyFactoryBean">  
    70.         <property name="target">  
    71.             <list>  
    72.                 <ref local="cacheAdvertisService"/>  
    73.                 <ref local="cacheLinksService"/>  
    74.                 <ref local="cacheArticleService"/>  
    75.                 <ref local="cacheCompanyService"/>  
    76.                 <ref local="cacheJobService"/>  
    77.                 <ref local="cacheSpecialCompanyService"/>  
    78.                 <ref local="cachePersonService"/>  
    79.             </list>  
    80.         </property>  
    81.         <property name="interceptorNames">  
    82.             <list>  
    83.                 <value>methodCachePointCut</value>  
    84.             </list>  
    85.         </property>  
    86.     </bean>  


    看bean的名称,ProxyFactoryBean. 猜测应该和代理有关。百度了一下,的确如此。 考虑了一下,这段代码大体意思是,org.springframework.aop.support.RegexpMethodPointcutAdvisor   对其ref指向的下面的拦截的bean中的某些方法进行切面。拦截的方法就是pattern中定义的。

    而org.springframework.aop.framework.ProxyFactoryBean 这个类,就是使用了代理,重新生成了几个对象,而使这几个bean避免了延迟加载,因此定时代码写在他里面会执行!

     
    0
  • 相关阅读:
    JS计算每个字符出现的次数
    FCL研究-目录
    FCL研究-LINQ-System.Linq Enumerable
    FCL研究-集合- System.Collections 接口和对象集合
    Vimperator常用快捷键
    【转】WCF光芒下的Web Service
    【转】GridView 加载空行并点击编辑每一个单元格
    [转]在C#程序设计中使用Win32类库
    OpenOffice实现Office转Pdf(支持自定义添加水印、页眉、页脚)
    VUE 动态路由
  • 原文地址:https://www.cnblogs.com/baihaojie/p/6543928.html
Copyright © 2011-2022 走看看