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

标签 java jsp threadpool executorservice java.util.concurrent

我们有一个基于 JSP 应用程序的多用户 token 。 我们在专门的类(class)中管理所有类(class) SessionManager 。 当新用户打开任何应用程序页面(通常是主页)时,后者会初始化一个 session 并将其缓存在 map 中,并在关联的 token 不再有效时销毁该 session 。所以,我们有SessionManager::initSessionManager::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/

相关文章:

java - 如何将对象数组打印到屏幕上?

java - 如何在 Struts 2 的单个 View 中使用多个表单/操作

java - 如何在线程池中编写run方法

Java Spark : Stack Overflow Error on GroupBy

java - 为什么首先对较小的子数组进行排序会导致更快的快速排序?

java - 当对象列表从 View (jsp)传递到 Controller 时附加方括号

java - 使用 servlet 从数据库中删除记录

c# - 寻找 .NET 4 线程池

Java应用线程创建

java - 如何在log4j2中增量重新配置?