Mise à niveau vers springframework.scheduling.concurrent?
Question
Au printemps 3.0 le ScheduledTimerTask est dépréciée et je ne peux pas comprendre comment mettre à niveau à 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>
Lorsque le OnlineTimerTask étend java.util.TimerTask. Il est une tâche simple qui publie un message à l'éditeur chaque minute. J'ai vérifié la documentation, mais rien .. Je ne comprends pas de quelle manière d'utiliser de l'emballage simultané et qui convient le mieux.
Aussi je veux transformer ce xml en @Bean en Java.
EDIT:. J'ai donc essayé de mettre en œuvre le xml avec @Bean et @Configuration à la place et voici ce que je suis
@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;
}
}
Est-ce que le code ci-dessus est correct pour remplacer xml? Est-ce que dans mon cas les setScheduledExecutorTasks fonctionner correctement? Je veux dire ce que le référencement à est appelé plus d'une fois, travaillera ici la même instance de haricot, si onlineTimeSchedule ()?
scheduledFactoryBean.setScheduledExecutorTasks(new ScheduledExecutorTask[] {onlineTimeSchedule()});
La solution
Utilisation org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean
à la place de org.springframework.scheduling.timer.TimerFactoryBean
de org.springframework.scheduling.concurrent.ScheduledExecutorTask
et de l'utilisation à la place de org.springframework.scheduling.timer.ScheduledTimerTask
. Vous devez régler les noms des propriétés et des valeurs selon les besoins, mais cela devrait être assez évident.
En option, vous pouvez factoriser votre com.example.OnlineTimerTask
de ne pas prolonger java.util.TimeTask
comme ScheduledTimerTask ne nécessite que runnable.
Autres conseils
Spring 4 configuration - Ci-dessous, travail de configuration après la migration printanière de 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>
La réponse est - Ajouter un champ "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>