2015-04-24 3 views
1

Мы обновили весеннюю версию нашего проекта с 3.2.7 до 4.0.6 и обнаружили, что класс org.springframework.scheduling.timer.TimerFactoryBean больше не существует. Spring 4.0.6. Я попробовал решение, упомянутое здесь stackOverflowSolution. Но это не работает для меня.Alternate для ScheduledExecutorFactoryBean весной 4

Вот что я пробовал. В одной из контекста XML я следующие фасоли

<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <!-- leave empty --> </list> </property> </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 с именем 'timerFactory' должен иметь тип [java.util.Timer], но был фактически типом [java.util.concurrent.ScheduledThreadPoolExecutor]

Пожалуйста, дайте мне знать, какие изменения мне нужно сделать, чтобы сделать этот код работать с Spring 4

ответ

1

Понял работает. В заявке bean timerFactory bean был объявлен как тип org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean, но я пытался отбросить его до java.util.Timer, что было неправильно на первом месте. Затем я попытался наложить его на ScheduledExecutorFactoryBean, который все еще не работал. Это связано с тем, что ScheduledExecutorFactoryBean является фасолью весны. Это означает, что он предназначен для создания объекта целевого типа, но не для самого экземпляра. В этом случае тип цели для ScheduledExecutorFactoryBean равен org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean Итак, я набрал timerFactory bean, чтобы напечатать ScheduledExecutorFactoryBean, который работал. Ниже приведена модифицированная строка кода

ScheduledThreadPoolExecutor timer = 
     (ScheduledThreadPoolExecutor) context.getBean("timerFactory", 
     ScheduledThreadPoolExecutor.class); 
Смежные вопросы