Spring MVC アプリケーションとして実装されるプラグインを構築しています。このプラグインは、いずれかのサーバーの GUI を介して 3 ~ 6 台の tomcat サーバーにデプロイされます。プラグインの各インスタンスには、サーバー上の情報を収集して中央データベースに保存するための @Scheduled メソッドがあります。
私の問題は、プラグインをアンインストールするための GUI インターフェイスが @Scheduled スレッドの一部を実行したままにすることです。
たとえば、サーバー 1 から 3 がある環境があります。サーバー 1 の GUI を介してプラグインをインストールして有効にします。サーバー 1 から 3 で @Scheduled スレッドを実行するアプリケーションの 3 つのインスタンスが存在します。サーバー 1 でプラグインをアンインストールすると、スレッドはサーバー 1 で確実に強制終了されますが、サーバー 2 または 3 では強制終了されません。
私は以下を実装しましたが、動作は持続します:
@Component
public class ContextClosedListener implements ApplicationListener<ContextClosedEvent> {
@Autowired
ThreadPoolTaskExecutor executor;
@Autowired
ThreadPoolTaskScheduler scheduler;
public void onApplicationEvent(ContextClosedEvent event) {
scheduler.shutdown();
executor.shutdown();
}
}
さらに、これを @Scheduled メソッドではなくコンテキスト リスナーとして実装することを考えましたが、メンテナンスと拡張性の理由から Spring に固執したいと思います。
このような環境でスレッドを確実に強制終了するにはどうすればよいですか?