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

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

spring 定时任务的配置:

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

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

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

然后,配置namespace的别名:

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

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

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

  1. <task:annotation-driven/>

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

执行定时的代码:

  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上 加上:

  1. @Lazy(false)

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

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

  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. <value>com.xajob.service.LinksService.getAll</value>
  28. <value>com.xajob.service.AdvertisService.getAll</value>
  29. <value>.*getFamousCompanies</value>
  30. <value>.*getNewPerson</value>
  31. <value>.*getNew5Job</value>
  32. <value>.*getNew5Urgent</value>
  33. <value>.*getNewCompany</value>
  34. <value>.*getTop20HighLevelJob</value>
  35. <value>com.xajob.service.SpecialCompanyService.*</value>
  36. <value>com.xajob.service.ArticleService.getByType</value>
  37. <value>com.xajob.service.ArticleService.pageByType</value>
  38. <value>com.xajob.service.ArticleService.getTopTen</value>
  39. <value>com.xajob.service.ArticleService.getNewEight</value>
  40. <value>com.xajob.service.ArticleService.getImgNews</value>
  41. <value>com.xajob.service.ArticleService.groupByType</value>
  42. </list>
  43. </property>
  44. </bean>
  45. <bean id="cacheAdvertisService"
  46. class="com.xajob.service.AdvertisService">
  47. </bean>
  48. <bean id="cacheLinksService"
  49. class="com.xajob.service.LinksService">
  50. </bean>
  51. <bean id="cacheArticleService"
  52. class="com.xajob.service.ArticleService">
  53. </bean>
  54. <bean id="cacheCompanyService"
  55. class="com.xajob.service.CompanyService">
  56. </bean>
  57. <bean id="cacheJobService"
  58. class="com.xajob.service.JobService">
  59. </bean>
  60. <bean id="cacheSpecialCompanyService"
  61. class="com.xajob.service.SpecialCompanyService">
  62. </bean>
  63. <bean id="cachePersonService"
  64. class="com.xajob.service.PersonService">
  65. </bean>
  66. <bean id="cacheAdvertisInterceptor" class="org.springframework.aop.framework.ProxyFactoryBean">
  67. <property name="target">
  68. <list>
  69. <ref local="cacheAdvertisService"/>
  70. <ref local="cacheLinksService"/>
  71. <ref local="cacheArticleService"/>
  72. <ref local="cacheCompanyService"/>
  73. <ref local="cacheJobService"/>
  74. <ref local="cacheSpecialCompanyService"/>
  75. <ref local="cachePersonService"/>
  76. </list>
  77. </property>
  78. <property name="interceptorNames">
  79. <list>
  80. <value>methodCachePointCut</value>
  81. </list>
  82. </property>
  83. </bean>

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

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

 
0

spring定时任务配置,以及不执行的解决办法的更多相关文章

  1. 基于Spring框架的简单多数据源切换解决办法

    基于Spring框架的简单多数据源切换解决办法 Spring框架JDBC包提供了一个抽象类AbstractRoutingDataSource提供了动态切换数据库的基础方法.我们仅仅需要实现一个简单的数 ...

  2. Win 2008 R2安装SQL Server 2008“性能计数器注册表配置单元一致性”失败的解决办法

    Win 2008 R2安装SQL Server 2008“性能计数器注册表配置单元一致性”失败的解决办法(2011-02-23 19:37:32) 转载▼   今天在惠普服务器上安装数据库2008时, ...

  3. Win7安装Oracle Instantclient ODBC驱动 后配置DSN时出错的解决办法 SQORAS32

    安装过程简述 oracle官网下载了 instantclient-odbc-nt--.zip instantclient-basic-nt-.zip 我这是32位版的win7,按照需要下载对应的版本. ...

  4. spring 定时任务配置

    1.(易)如何在spring中配置定时任务? spring的定时任务配置分为三个步骤: 1.定义任务 2.任务执行策略配置 3.启动任务 (程序中一般我们都是到过写的,直观些) 1.定义任务 < ...

  5. struts,hibernate,spring配置时问题汇总及解决办法

    1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor 缺少asm-3.3.jar 2.java.lang.NoClassDe ...

  6. Learn Rails5.2- ActiveRecord: Migration , spring的使用(不兼容的解决办法)

    偶然一次: 运行rails generate停止不动,网上查找答案,可能是bundle update 之后 spring 版本变化了,和正在运行的 spring 实例不兼容. Spring导致的同样的 ...

  7. struts2,hibernate4,spring3配置时问题汇总及解决办法

    文章转载于wanglihu的博客,原文链接http://wanglihu.iteye.com/blog/1897718 1.java.lang.NoClassDefFoundError: org/ob ...

  8. spring boot jpa 使用update 报错解决办法

    在spring boot jpa 中自定义sql,执行update操作报错解决办法: 在@Query(...)上添加 @Modifying@Transactional注解

  9. Xshell 连接虚拟机OS Linux 设置静态ip ,网络配置中无VmWare8 的解决办法

    前序:最近开始研究Hadoop平台的搭建,故在本机上安装了VMware workstation pro,并创建了Linux虚拟机(centos系统),为了方便本机和虚拟机间的切换,准备使用Xshell ...

随机推荐

  1. MBR:主引导记录:

    下面内容严重参考:百度百科: Main Boot Record)是位于磁盘最前边的一段引导(Loader)代码.它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别.分区引导信息的定位,它由磁 ...

  2. 转换基于Maven的Java项目支持Eclipse IDE

    在过去的教程中,使用 Maven 创建了一个Java项目,但是这个项目不能导入到Eclipse IDE中,因为它不是 Eclipse 风格的项目. 这里有一个指南,向您演示如何转换 Maven 生成 ...

  3. svn -- svn配置自动启动

    配置自动启动服务 1.添加到系统服务 sc create SVNService binpath=  “D:\subversion\bin\svnserve.exe --service -r D:/sv ...

  4. Linux系统源码安装软件过程中configure选项-prefix的作用

    在linux和unix环境中,源码安装是最常用的软件安装方式,一些软件出了提供源码外,也提供各种发行版的二进制安装包(如基于redhat包管理工具的rpm包),但强烈建议使用源码安装方式. 在linu ...

  5. sqlite学习笔记1:编译数据库

    首先说下我使用的是Linux环境 一 下载源代码 官网下载:点这里 二 编译 1 解压 下载完毕之后通常会在当前用户的"下载"文件夹中,首先cd到下载文件夹,然后创建一个文件件.用 ...

  6. Docker镜像相关

    一.中间镜像 通过持续集成工具Jenkins构建Docker镜像并运行容器,采用的是Docker Compose来进行编排构建运行的.但是每次构建完毕以后通过docker images命令查询,可以发 ...

  7. CentOS 经常使用系统命令

    # uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue   # 查看操作系统版本号# cat /proc/cpuinfo      # 查看CPU信息# ...

  8. Android 获取内存信息

    由于工作需要,研究了一下android上获取内存信息的方法,总结如下: 1.SDK获取 在Java层利用API获取很简单,直接使用ActivityManager.MemoryInfo类即可,代码如下: ...

  9. 移植3.4.2的Kernel到JZ2440

        本文将介绍如何移植linux-3.4.2内核到JZ2440开发板上的全过程,使用的交叉编译工具版本为 arm-linux-gcc-4.3.2.tar.bz2     下面来一步一步介绍如何移植 ...

  10. iOS模拟(糟糕的)网络环境

    有时候为了模拟在糟糕的网络环境下app的表现,会故意拔网线(断wifi),苹果其实提供了专门的工具来精确地模拟你在几个预设的场景下的网络连接情况:Network Link Conditioner 点击 ...