我们将项目的spring版本从3.2.7升级到4.0.6,发现org.springframework.scheduling.timer.TimerFactoryBean类不再存在于spring 4.0.6中。我尝试了这里提到的解决方案stackOverflowSolution。但这对我不起作用。
这是我尝试过的。在上下文之一xml中,我有以下bean
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<!-- leave empty -->
</list>
</property>
</bean>
根据链接中提到的解决方案,我更改了bean定义,如下所示,使用org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean
<bean id="timerFactory" class="org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean">
<!-- <property name="scheduledTimerTasks"> -->
<property name="scheduledExecutorTasks">
<list>
<!-- leave empty-->
</list>
</property>
</bean>
但是这个解决方案对我不起作用,因为以下代码因类型转换而破坏
ProcessInitiatorTask timerTask = (ProcessInitiatorTask) context.getBean("initiateProcessesTask", ProcessInitiatorTask.class);
event.getServletContext().setAttribute("CURRENT_TASK", timerTask);
timerTask.init(config);
// Code will break at below line
Timer timer = (Timer) context.getBean("timerFactory", Timer.class);
timer.schedule(timerTask, 10000L, config.getPeriod().longValue() * 60 * 1000);
当我运行此代码时,我得到org.springframework.beans.factory.BeanNotOfRequiredTypeException:Bean命名为&#39; timerFactory&#39;必须是[java.util.Timer]类型,但实际上是[java.util.concurrent.ScheduledThreadPoolExecutor]类型
请让我知道我需要做些什么修改才能使此代码适用于Spring 4
答案 0 :(得分:1)
搞定了。在bean声明timerFactory
中,bean被声明为org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean
类型,但我试图将它转换为java.util.Timer
,这在第一时间是错误的。然后我试着把它投到ScheduledExecutorFactoryBean
,但仍然无法正常工作。这是因为ScheduledExecutorFactoryBean
是一个Spring Factory bean。这意味着它旨在创建目标类型的对象,但不是自身的实例。在这种情况下,ScheduledExecutorFactoryBean
的目标类型是org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean
所以我将timerFactory
bean转换为有效的ScheduledExecutorFactoryBean
类型。以下是修改后的代码行
ScheduledThreadPoolExecutor timer =
(ScheduledThreadPoolExecutor) context.getBean("timerFactory",
ScheduledThreadPoolExecutor.class);