ScheduledExecutorFactoryBean

ScheduledExecutorFactoryBean

我们将项目的春季版本从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);

09-03 20:58