Aggiornamento a SpringFramework.Scheduling.ConCurrent?
Domanda
A partire da Spring 3.0, il PresentatedTimerTask è deprecato e non riesco a capire come eseguire l'aggiornamento a 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>
Dove l'onlinetimertask si estende java.util.imertask. È un compito semplice che pubblica un messaggio all'editore ogni minuto. Ho controllato la documentazione, ma niente .. Non riesco a capire da che parte utilizzare dal pacchetto simultaneo e quale si adatta al meglio.
Inoltre voglio trasformare questo XML in @Bean in Java.
MODIFICARE: Quindi ho provato ad implementare l'XML con @Bean e @Configuration e qui è quello che ho ottenuto.
@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;
}
}
Il codice sopra sarà la corretta sostituzione di XML? Nel mio caso i setScheduledeExecutortaSks funzionano correttamente? Voglio dire, il riferimento alla stessa istanza di fagioli, se onlinetimeschedule () viene chiamato più di una volta, funzionerà qui?
scheduledFactoryBean.setScheduledExecutorTasks(new ScheduledExecutorTask[] {onlineTimeSchedule()});
Soluzione
Uso org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean
al posto di org.springframework.scheduling.timer.TimerFactoryBean
e usa org.springframework.scheduling.concurrent.ScheduledExecutorTask
al posto di org.springframework.scheduling.timer.ScheduledTimerTask
. Dovrai regolare i nomi e i valori delle proprietà secondo necessità, ma dovrebbe essere piuttosto evidente.
Facoltativamente, potresti refactoring tuo com.example.OnlineTimerTask
non estendere java.util.TimeTask
Poiché il PianificatMeMerTask richiede solo un Runnable.
Altri suggerimenti
Configurazione Spring 4 - sotto la configurazione funzionante dopo la migrazione a molla da 3.2.x a 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 risposta è: aggiungi un campo "eseguibile"
<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>