【发布时间】:2017-12-07 03:11:51
【问题描述】:
我们有一个基于多用户令牌的 JSP 应用程序。
我们在一个专门的课程SessionManager 中管理所有会话。
后者在新用户打开任何应用程序页面(通常是主页)时初始化会话并将其缓存在地图中,并在关联的令牌不再有效时销毁此会话。所以,我们有SessionManager::init 和SessionManager::destroy。
最近我在我们的应用程序中引入了ExecutorService,用于一些通过AJAX调用从前端开始的异步任务以及一些耗时的方法。
我在SessionManager::init 中创建ExecutorService 实例并将其设置为会话属性,并在SessionManager::destroy 中关闭此实例(按照Oracle 的建议)。通过这种方式,我们为每个用户提供了单独的 ExecutorService 实例,由其会话令牌标识,只要用户使用该应用程序,该实例就会存在。
我对这样的架构很满意,但不是 100% 将ExecutorService 实例作为属性放在会话中。
另一种方法是创建并公开ExecutorService 实例以供所有用户会话使用。可能实现为线程安全的单例类。 但是如果我使用这种方法,我不知道在哪里关闭 ExecutorService 实例,我应该这样做吗?
这是主要问题;是否可以保留当前的实现:ExecutorService 每个用户的实例作为属性存储在当前会话中?
【问题讨论】:
标签: java jsp threadpool executorservice java.util.concurrent