Обновление до Springframework.scheduling.concurrent?
Вопрос
По состоянию на весну 3.0 запланированная тимскаска устарела, и я не могу понять, как перейти на org.springframework.scheduling.concurrent.
<bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="onlineTimeSchedule" />
</list>
</property>
</bean>
<bean id="onlineTimeSchedule" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" class="com.example.OnlineTimerTask" />
</property>
<property name="period" value="60000" />
<property name="delay" value="1000" />
</bean>
Где онлимерт, расширяет java.util.timertask. Это простая задача, которая публикует сообщение для издателя каждую минуту. Я проверил документацию, но ничего ... я не могу понять, какой способ использовать из параллельного пакета и что подходит лучше всего.
Также я хочу превратить этот XML в @Bean в Java.
РЕДАКТИРОВАТЬ: Поэтому я попытался реализовать XML с @Bean и @Configuration вместо этого, и вот что я получил.
@Configuration
public class ContextConfiguration {
@Bean
public ScheduledExecutorFactoryBean scheduledExecutorFactoryBean() {
ScheduledExecutorFactoryBean scheduledFactoryBean = new ScheduledExecutorFactoryBean();
scheduledFactoryBean.setScheduledExecutorTasks(new ScheduledExecutorTask[] {onlineTimeSchedule()});
return scheduledFactoryBean;
}
@Bean
public ScheduledExecutorTask onlineTimeSchedule() {
ScheduledExecutorTask scheduledTask = new ScheduledExecutorTask();
scheduledTask.setDelay(1000);
scheduledTask.setPeriod(60000);
scheduledTask.setRunnable(new OnlineTimerTask());
return scheduledTask;
}
}
Будет ли код выше правильной замены для XML? Будет ли в моем случае работать правильно? Я имею в виду, будет ли ссылка на один и тот же экземпляр бобов, если onlinetimesschedule () вызывается более одного раза, будет ли работать здесь?
scheduledFactoryBean.setScheduledExecutorTasks(new ScheduledExecutorTask[] {onlineTimeSchedule()});
Решение
Использовать org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean
на месте org.springframework.scheduling.timer.TimerFactoryBean
и использовать org.springframework.scheduling.concurrent.ScheduledExecutorTask
на месте org.springframework.scheduling.timer.ScheduledTimerTask
. Анкет Вам нужно будет настроить имена и значения свойств по мере необходимости, но это должно быть довольно очевидным.
При желании вы можете рефакторировать свой com.example.OnlineTimerTask
не распространяться java.util.TimeTask
Поскольку запланированная тимскаска требует только запуска.
Другие советы
Конфигурация пружины 4 - ниже конфигурации, работающая после пружинной миграции с 3.2.x до 4.6.x
<bean id="schedulerTask"
class="org.springframework.scheduling.support.MethodInvokingRunnable">
<property name="targetObject" ref="springJmsListnerContainer" />
<property name="targetMethod" value="execute" />
</bean>
<bean id="timerTask" class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">
<property name="runnable" ref="schedulerTask" />
<property name="delay" value="100" />
<property name="period" value="60000" />
</bean>
<bean class="org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean">
<property name="scheduledExecutorTasks">
<list>
<ref bean="timerTask" />
</list>
</property>
</bean>
Ответ - добавьте одно «заполненное» поле
<bean id="scheduledExecutorTask"
class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">
<!-- wait 10 milli seconds before starting repeated execution -->
<property name="delay">
<value>10</value>
</property>
<!-- run every 1 second -->
<property name="period">
<value>1000</value>
</property>
<property name="runnable">
<ref bean="checkInvokingTask"/>
</property>
</bean>