在 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);