在多用户 JSP J2EE 应用程序中创建和关闭 ExecutorService 实例

Create and shoutdown ExecutorService instance in multiuser JSP J2EE appication

我们有一个基于多用户令牌的 JSP 应用程序。 我们在专用 class SessionManager 中管理所有会话。 后者在新用户打开任何应用程序页面(通常是主页)时初始化会话并将其缓存在映射中,并在关联的令牌不再有效时销毁此会话。所以,我们有 SessionManager::initSessionManager::destroy.

最近我在我们的应用程序中引入了 ExecutorService,用于通过 AJAX 调用从前端启动的一些异步任务和一些耗时的方法。

我在 SessionManager::init 中创建 ExecutorService 实例并将其设置为会话属性,并在 SessionManager::destroy 中关闭该实例(按照 Oracle 的建议)。通过这种方式,我们为每个用户提供了单独的 ExecutorService 实例,由其会话令牌标识,只要用户使用该应用程序,该实例就会存在。

我对这样的架构很满意,但不是 100% 将 ExecutorService 实例作为属性放入会话中有多好。

另一种方法是创建并公开 ExecutorService 实例以供所有用户会话使用。可能实现为线程安全单例 class。 但是 如果我使用这种方法,我不知道在哪里关闭 ExecutorService 实例,我应该这样做吗?

这是主要问题;是否可以保留当前实现:ExecutorService 每个用户的实例作为属性存储在当前会话中?

每个用户一个线程池看起来很荒唐,为什么?

您需要使用 ServletContextListener 一旦创建和销毁 servlet 上下文(可能是应用程序范围),服务器就会调用它

例如

@WebListener("daemon_dude")
public class daemon_dude implements ServletContextListener{
...
private ScheduledExecutorService scheduler;//or whatever type of pool
public void contextInitialized(ServletContextEvent event) {
  scheduler = Executors.newSingleThreadScheduledExecutor();//and use it
}
public void contextDestroyed(ServletContextEvent event){
  scheduler.shutdownNow();//or any more peaceful approach
}
...
}