【问题标题】:Create and shoutdown ExecutorService instance in multiuser JSP J2EE appication在多用户 JSP J2EE 应用程序中创建和关闭 ExecutorService 实例
【发布时间】:2017-12-07 03:11:51
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java jsp threadpool executorservice java.util.concurrent


    【解决方案1】:

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

    您需要使用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
    }
    ...
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多