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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM