我们有一个基于 JSP 应用程序的多用户 token 。
我们在专门的类(class)中管理所有类(class) SessionManager
。
当新用户打开任何应用程序页面(通常是主页)时,后者会初始化一个 session 并将其缓存在 map 中,并在关联的 token 不再有效时销毁该 session 。所以,我们有SessionManager::init
和SessionManager::destroy
.
最近我介绍了ExecutorService
在我们的应用程序中,一些异步任务通过 AJAX 调用从前端启动,以及一些耗时的方法。
我创建并设置 ExecutorService
实例作为 SessionManager::init
中的 session 属性,并在 SessionManager::destroy
中关闭此实例(按照 Oracle 的建议) 。这样我们就有了单独的ExecutorService
每个用户的实例由其 session token 标识,只要用户使用该应用程序,该实例就存在。
我对这样的架构很满意,但并不是 100% 放置 ExecutorService
有多好。 session 中的实例作为属性。
另一种方法是创建并公开 ExecutorService
实例可供所有用户 session 使用。可能作为线程安全的单例类实现。 但是如果我使用这种方法,我不知道在哪里关闭 ExecutorService
例如,我应该这样做吗?
这是主要问题;可以继续使用当前的实现吗:ExecutorService
每个用户的实例作为属性存储在当前 session 中?
最佳答案
为每个用户提供一个线程池看起来很无意义,为什么?
您需要使用 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
}
...
}
关于java - 在多用户 JSP J2EE 应用程序中创建和关闭 ExecutorService 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44892530/