我正在構建一個作爲Spring MVC應用程序實現的插件。這個插件通過一臺服務器上的gui部署在3-6臺tomcat服務器上。插件的每個實例都有一個@Scheduled方法來收集服務器上的信息並將其存儲在中央數據庫中。如何可靠地殺死跨服務器的@ Scheduled線程?
我的問題是,卸載插件的GUI界面留下了一些@Scheduled線程運行。
例如,我有一個服務器1 - 3的環境。我通過服務器1上的gui安裝並啓用插件。現在有3個應用程序在服務器1 - 3上運行@Scheduled線程。如果我回到服務器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來進行維護和擴展責任原因。
如何可靠地殺死這樣的環境中的線程?