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
  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/baihaojie/p/6543928.html
Copyright © 2011-2022 走看看