Обновление до springframework.scheduling.concurrent?
Как и в случае с Spring 3.0, функция ScheduledTimerTask устарела, и я не могу понять, как выполнить обновление до 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>
Где OnlineTimerTask расширяет java.util.TimerTask. Это простая задача, которая каждую минуту публикует сообщение издателю. Я проверил документацию, но ничего.. Я не могу понять, какой способ использовать из параллельного пакета и который подходит наилучшим образом.
Также я хочу превратить этот xml в @ Bean в Java.
EDIT: Поэтому я попытался реализовать 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? Будет ли в моем случае правильно работать setScheduledExecutorTasks? Я имею в виду, будет ли ссылка на тот же экземпляр bean, если вызывается onTimeSchedule() более одного раза, будет работать здесь?
scheduledFactoryBean.setScheduledExecutorTasks(new ScheduledExecutorTask[] {onlineTimeSchedule()});
Ответы
Ответ 1
Используйте 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
, так как ScheduledTimerTask требует только runnable.
Ответ 2
Spring 4 конфигурация - ниже конфигурации, работающей после spring миграции с 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>
Ответ 3
Ответ: добавьте одно поле "runnable"
<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>