Upgrade auf SpringFramework.Scheduling.Concurrent?
Frage
Ab dem Frühjahr 3.0 ist die geplante TimeTask veraltet und ich kann nicht verstehen, wie man auf org.springframework.Scheduling.Concurrent ein Upgrade eingreift.
<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>
Wo die onlineetimertask erweitert java.util.timertask. Es ist eine einfache Aufgabe, die jede Minute eine Nachricht an den Verlag veröffentlicht. Ich habe die Dokumentation überprüft, aber nichts. Ich kann nicht verstehen, wie ich aus dem gleichzeitigen Paket verwenden soll und welche am besten passt.
Außerdem möchte ich diesen XML in @Bean in Java verwandeln.
BEARBEITEN: Also habe ich versucht, den XML mit @Bean und @Configuration zu implementieren, und hier habe ich hier.
@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;
}
}
Wird der obige Code für XML korrekt sein? Funktioniert die SetScheduledexecutortasks in meinem Fall ordnungsgemäß? Ich meine, wird die Verweise auf dieselbe Bean -Instanz, wenn onlineTimeScher () mehr als einmal bezeichnet wird, hier funktionieren?
scheduledFactoryBean.setScheduledExecutorTasks(new ScheduledExecutorTask[] {onlineTimeSchedule()});
Lösung
Verwenden org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean
anstelle von org.springframework.scheduling.timer.TimerFactoryBean
und verwenden org.springframework.scheduling.concurrent.ScheduledExecutorTask
anstelle von org.springframework.scheduling.timer.ScheduledTimerTask
. Sie müssen die Eigenschaften und Werte nach Bedarf anpassen, aber das sollte ziemlich selbstverständlich sein.
Optional können Sie Ihre neu umrüsten com.example.OnlineTimerTask
sich nicht ausdehnen java.util.TimeTask
Da die geplante TimeTasked nur einen Runnable erfordert.
Andere Tipps
Feder 4 -Konfiguration - Unter Konfiguration funktioniert nach der Federmigration von 3.2.x bis 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>
Die Antwort lautet: Fügen Sie ein "Lauf" -Feld hinzu
<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>