现在我有一个带有 @Scheduled 方法的 bean,工作正常;它在我的 applicationContext.xml 中声明。
<!-- some JPA stuff -->
<bean id="aWorkingBean" class="some.package.WorkingBean">
<property name="someDAO" ref="someDAO" />
</bean>
<task:annotation-driven scheduler="myScheduler" />
<task:scheduler id="myScheduler" pool-size="10" />
我想做的是根据请求以编程方式安排另一种方法(例如加载一些带注释的类并注入(inject)其依赖项)。像这样的东西:
WebApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext();
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(NonWorkingBean.class);
// add DAO references...
ctx.registerBeanDefinition("nonWorkingBean", builder.getBeanDefinition()); // <-- this doesn't work
显然它不起作用,因为 XmlWebApplicationContext 是只读的并且没有 registerBeanDefinition 方法。还有其他方法可以实现吗?
我正在使用 Tomcat 6.0.29 和 Spring 3.0.4
最佳答案
<task:scheduler>
和 @Scheduled
实际上只是一种调度静态任务的便捷方法。它不太适合动态调度。是的,您可以让它发挥作用,但这会很尴尬。
当你输入 <task:scheduler id="myScheduler">
在你的配置中,Spring 创建一个 TaskScheduler
bean 叫myScheduler
.这可以注入(inject)到您自己的 bean 中,并且可以通过编程方式调用以安排新任务。您需要创建一个 Runnable
传递给 TaskScheduler
,但这应该很简单。
关于java - 如何在运行时在启用 Spring 的 Web 应用程序中安排新方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4279446/