我正在构建一个作为 Spring MVC 应用程序实现的插件。该插件通过其中一台服务器上的 gui 部署在 3 - 6 台 tomcat 服务器上。插件的每个实例都有一个@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。
我怎样才能在这样的环境中可靠地杀死线程?