在Spring 4中替代ScheduledExecutorFactoryBean

时间:2015-04-24 14:25:14

标签: java spring quartz-scheduler

我们将项目的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

1 个答案:

答案 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);