我们将项目的春季版本从3.2.7升级到4.0.6,发现org.springframework.scheduling.timer.TimerFactoryBean类在春季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:名为“ timerFactory”的Bean必须为[java.util.Timer]类型,但实际上为[java.util.concurrent.ScheduledThreadPoolExecutor]类型
请让我知道为使此代码与Spring 4配合使用需要进行哪些修改
最佳答案
得到它的工作。在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);