gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:44:18 25 4
gpt4 key购买 nike

我们有一个基于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com