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をJavaの@Beanに変えたいと思います。
編集: そこで、代わりに@Beanと@ConfigurationでXMLを実装しようとしましたが、これが私が得たものです。
@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は適切に機能しますか? OnlinetimesSchedule()が複数回呼び出された場合、同じBeanインスタンスを参照することは、ここで機能することを意味しますか?
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
ScheduleDtimertaskは実行可能なもののみを必要とするためです。
他のヒント
スプリング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>
答えは - 1つの「実行可能」フィールドを追加します
<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>