spring定时任务配置,以及不执行的解决办法

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

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

spring 定时任务的配置:

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

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

http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd

然后,配置namespace的别名:

xmlns:task="http://www.springframework.org/schema/task"


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

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

<task:annotation-driven/>


这样。spring就可以根据注解扫描这些bean,然后检查注解代码了。

执行定时的代码:

@Scheduled(cron="0/5 * *  * * ? ")
public void schetest(){
   System.out.println("scheduled invoke!");
}

每隔五秒执行一次。

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

@Lazy(false)

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


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

<bean id="methodCachePointCut"
		class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		<property name="advice">
			<ref local="methodCacheInterceptor" />
		</property>
		<property name="patterns">
			<list>
				<!--
				<value>com.xajob.service.AdvertisService.getAll</value>
				<value>com.xajob.service.LinksService.getAll</value>
				<value>com.xajob.service.CompanyService.getFamousCompanies</value>
				<value>execution(com.xajob.service.JobService.getByIndustr*(..))</value>
				<value>execution(com.xajob.service.CompanyService.getByIndustr*(..))</value>
				<value>execution(com.xajob.service.CompanyService.getGraduate*(..))</value>
				<value>execution(com.xajob.service.JobService.getGraduate*(..))</value>
				<value>execution(com.xajob.service.JobService.countByIndustr*(..))</value>
				<value>execution(com.xajob.service.PersonService.getNew*(..))</value>
				<value>execution(com.xajob.service.JobService.getNew*(..))</value>
				<value>execution(com.xajob.service.CompanyService.getNew*(..))</value>
				<value>execution(com.xajob.service.ArticleService.get*(..))</value>
				<value>execution(com.xajob.service.ArticleService.page*(..))</value>
				<value>execution(com.xajob.service.ArticleService.group*(..))</value>
				<value>com.xajob.service.JobService.pageHighLevelJob</value>
				<value>execution(com.xajob.service.JobService.getTop*(..))</value>
				<value>execution(com.xajob.service.SpecialCompanyService.get*(..))</value>
				  -->
				
				<value>com.xajob.service.LinksService.getAll</value>
				<value>com.xajob.service.AdvertisService.getAll</value>
				<value>.*getFamousCompanies</value>
				<value>.*getNewPerson</value>
				<value>.*getNew5Job</value>
				<value>.*getNew5Urgent</value>
				<value>.*getNewCompany</value>
				<value>.*getTop20HighLevelJob</value>
				<value>com.xajob.service.SpecialCompanyService.*</value>
				<value>com.xajob.service.ArticleService.getByType</value>
				<value>com.xajob.service.ArticleService.pageByType</value>
				<value>com.xajob.service.ArticleService.getTopTen</value>
				<value>com.xajob.service.ArticleService.getNewEight</value>
				<value>com.xajob.service.ArticleService.getImgNews</value>
				<value>com.xajob.service.ArticleService.groupByType</value>
			</list>
		</property>
	</bean>
	
	<bean id="cacheAdvertisService"
		class="com.xajob.service.AdvertisService">
	</bean>
	<bean id="cacheLinksService"
		class="com.xajob.service.LinksService">
	</bean>
	<bean id="cacheArticleService"
		class="com.xajob.service.ArticleService">
	</bean>
	<bean id="cacheCompanyService"
		class="com.xajob.service.CompanyService">
	</bean>
	<bean id="cacheJobService"
		class="com.xajob.service.JobService">
	</bean>
	<bean id="cacheSpecialCompanyService"
		class="com.xajob.service.SpecialCompanyService">
	</bean>
	<bean id="cachePersonService"
		class="com.xajob.service.PersonService">
	</bean>

	<bean id="cacheAdvertisInterceptor" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="target">
			<list>
				<ref local="cacheAdvertisService"/>
				<ref local="cacheLinksService"/>
				<ref local="cacheArticleService"/>
				<ref local="cacheCompanyService"/>
				<ref local="cacheJobService"/>
				<ref local="cacheSpecialCompanyService"/>
				<ref local="cachePersonService"/>
			</list>
		</property>
		<property name="interceptorNames">
			<list>
				<value>methodCachePointCut</value>
			</list>
		</property>
	</bean>


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

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

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值