在 Spring 4 中替代 ScheduledExecutorFactoryBean
Alternate for ScheduledExecutorFactoryBean in Spring 4
我们将项目的 spring 版本从 3.2.7 升级到 4.0.6,发现 org.springframework.scheduling.timer.TimerFactoryBean class 不再存在 spring 4.0.6。我尝试了这里提到的解决方案 WhosebugSolution 。但这对我不起作用。
这是我试过的。在上下文之一 xml 我有以下 bean
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<!-- leave empty -->
</list>
</property>
</bean>
根据 link 中提到的解决方案,我更改了下面的 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 工厂 bean。这意味着它旨在创建目标类型的对象而不是其自身的实例。在这种情况下,ScheduledExecutorFactoryBean
的目标类型是 org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean
所以我将 timerFactory
bean 转换为类型 ScheduledExecutorFactoryBean
,这有效。以下是修改后的代码行
ScheduledThreadPoolExecutor timer =
(ScheduledThreadPoolExecutor) context.getBean("timerFactory",
ScheduledThreadPoolExecutor.class);
我们将项目的 spring 版本从 3.2.7 升级到 4.0.6,发现 org.springframework.scheduling.timer.TimerFactoryBean class 不再存在 spring 4.0.6。我尝试了这里提到的解决方案 WhosebugSolution 。但这对我不起作用。
这是我试过的。在上下文之一 xml 我有以下 bean
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<!-- leave empty -->
</list>
</property>
</bean>
根据 link 中提到的解决方案,我更改了下面的 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 工厂 bean。这意味着它旨在创建目标类型的对象而不是其自身的实例。在这种情况下,ScheduledExecutorFactoryBean
的目标类型是 org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean
所以我将 timerFactory
bean 转换为类型 ScheduledExecutorFactoryBean
,这有效。以下是修改后的代码行
ScheduledThreadPoolExecutor timer =
(ScheduledThreadPoolExecutor) context.getBean("timerFactory",
ScheduledThreadPoolExecutor.class);