1.问题描述
singleton的bean,spring配置定时任务<task:scheduled-tasks>新增一个定时任务后每次触发定时任务都是执行两次。
2.问题分析
新增的定时任务类有点特殊,里面调用了另一个不受spring管理的对象,这个对象里又需要使用spring管理的单例bean,就在对象里使用了new ClassPathXmlApplicationContext()然后getBean()获取。
一切看似正常,
问题就出在new ClassPathXmlApplicationContext()这里。当显式的这样调用的时候,会再次加载bean,初始化spring上下文环境。相当于容器里除了刚启动时的一套之外又产生了一条spring上下文,
当然定时任务也有了两套。
这里还说明
另一个问题,单实例的bean并不是“单例模式”,只是保证一套spring上下文里只有一个bean实例。
3.解决办法
方法1)把新增的定时任务类也纳入spring管理范围,直接获取其他spring管理的bean.
方法2)使用ApplicationContextAware获取容器启动时的spring上下文环境。
还可以参考:
http://blog.csdn.net/budapest/article/details/38493003
http://www.blogjava.net/freeman1984/archive/2010/08/30/330214.html
分享到:
相关推荐
总结,通过以上步骤,我们就成功地在Spring 3中配置了Quartz定时任务,实现了每10秒执行一次的任务。在实际应用中,你可以根据需求定义更复杂的作业和触发器,以及使用Quartz的其他高级特性,如集群支持、持久化作业...
-- 是否可并发执行,如果为true,当任务触发时,即使上一次任务未执行完也会立即执行 --> <property name="concurrent" value="false"/> </bean> <!-- Trigger 调度配置 --> <bean id="myTrigger" class="org....
Spring整合Quartz是一个常见的任务调度解决方案,用于在Java应用程序中执行定时任务。Quartz是一个功能强大的、开放源代码的作业调度框架,而Spring框架则提供了一种优雅的方式来管理和集成Quartz到我们的应用中。让...
Spring Quartz 是一个强大的任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。结合Spring框架,可以方便地在企业级应用中实现复杂的时间触发逻辑。本实例提供了可以直接运行的任务调度解决方案,既...
根据提供的文件信息,本文将详细解析Java定时任务与Spring框架集成的相关知识点,包括如何在Spring环境中配置和管理定时任务。 ### Java定时任务简介 在Java中实现定时任务主要有以下几种方式: 1. **Timer和...
至此,Spring与Quartz的整合已经完成,定时任务将在设定的时间点自动执行。在需要的时候,可以调用`scheduler.shutdown()`来停止调度。 ### 4. 扩展与优化 在实际项目中,可以进一步优化和扩展,例如: - 使用...
- `jobClass` 属性用于设置执行定时任务的具体类,该类需要实现 `org.quartz.Job` 接口或继承 `org.springframework.scheduling.quartz.QuartzJobBean`。 ```xml <bean id="quartzClock" class="org.spring...
<groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.24</version> </dependency> </dependencies> ``` 配置文件示例: ```xml <beans xmlns=...
在测试类中,通过`ClassPathXmlApplicationContext`加载Spring配置文件,并获取`Scheduler`对象来验证定时任务是否按预期执行。 ### 总结 通过上述两种方式,我们可以利用Spring框架和Quartz库来轻松实现系统的...
<groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.x.x.RELEASE</version> </dependency> <!-- 其他Spring相关依赖 --> </dependencies> ``` 接下来,我们创建一个...
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appContext.xml"); context.start(); System.out.println("Service started."); // 等待服务运行 try { Thread.sleep(Long....
ApplicationContext orderServiceContext = new ClassPathXmlApplicationContext(serviceResources); ``` Setter 注入和构造函数注入 Spring 提供了三种注入方式:构造函数注入、Setter 注入和方法(接口)注入。...
本文将基于给定的文件信息“spring配置定时器”,详细阐述如何利用Spring框架配置一个简单且高效的定时任务。 ### 一、Spring定时器概述 #### 1.1 定时器简介 Spring框架提供了多种实现定时任务的方式,包括但不...
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/WEB-INF/velocity/" /> <property name=...
<artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> ``` 其中 `${spring.version}` 需要替换为实际使用的 Spring 版本号。 2. **配置邮件服务器**:在 ...
<artifactId>spring-context-test</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>...
4. **Bean定义**:解析XML的过程中,每个`<bean>`标签都会被解析成一个`BeanDefinition`对象,其中包含了bean的完整信息,如类名、属性值、依赖关系等。 5. **注册BeanDefinition**:解析后的`BeanDefinition`会被...
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); Student student = (Student) applicationContext.getBean("student"); System.out.println(student); ``` #### 四、...