春のバグトラッカーでこのバグを開きました。ここの賢い人たちがすでに私を助けてくれたらいいのに
3 に答える
スケジューラのデーモン プロパティで「true」を設定します。
<!-- task scheduling for @Scheduled annotation -->
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="1" />
<bean id="myScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="2" />
<property name="threadNamePrefix" value="myScheduler-"/>
<property name="waitForTasksToCompleteOnShutdown" value="false" />
<property name="daemon" value="true" />
</bean>
@Scheduled
Bean を実装しDisposableBean
て (Spring コンテキストがシャットダウンされたときに通知できるように)、main()
メソッドでコンテキストを明示的に閉じてみましたか?
概念的には、投稿されたコードが期待どおりに機能するかどうかわかりません。Spring は、@Scheduled
設定した時間/レートでタスクを実行するために新しいスレッドを起動する必要があります。つまり、main()
メソッドのコードが終了しても、JVM で非デーモン スレッドがまだ実行されています。Spring にこれらのスレッドをシャットダウンするように指示しない場合、どのように終了するのでしょうか?
編集:明確にするために、解決策は明示的close()
にあなたのを呼び出すことだと思いますApplicationContext
. そうしないと、Spring には、スケジュールされたタスクを実行している executor サービスにシャットダウンするように指示する方法がありません。main()
非デーモン スレッドがまだ実行されているため、終了時に JVM シャットダウン フックは呼び出されません。
これはJava構成を使用したソリューションです
@Bean
public TaskScheduler daemonTaskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setDaemon(false);
taskScheduler.setThreadNamePrefix("daemon");
taskScheduler.setPoolSize(5);
return taskScheduler;
}
または、実際に詳細を知りたい場合は、構成クラスを次のようにすることができます
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ただし、1 つのアプリケーション内で複数の TaskScheduler を使用できるようにすることはサポートされていません。そのためにJIRAを開きました