2017-07-03 46 views
0

我們有一個基於多用戶令牌的JSP應用程序。 我們管理專用課程SessionManager中的所有課程。 當新用戶打開任何應用程序頁面(通常是主頁)時,稍後初始化一個會話並將其緩存到映射中,並在相關令牌無效時銷燬該會話。所以,我們有SessionManager::initSessionManager::destroy在多用戶JSP中創建和放出ExecutorService實例J2EE應用

最近我在我們的應用程序中引入了ExecutorService,用於從前端通過AJAX調用開始的一些異步任務以及一些耗時的方法。

我在SessionManager::init中創建ExecutorService實例並將其設置爲會話屬性,然後在SessionManager::destroy中關閉此實例(由Oracle推薦)。通過這種方式,我們爲每個用戶分配ExecutorService實例,該實例由其會話令牌標識,只要用戶使用該應用程序就會生效。

我很高興看到這樣的體系結構,但不是100%將ExecutorService實例作爲屬性放在會話中有多好。

另一種方法是創建並公開ExecutorService實例以供所有用戶的會話使用。可能實現爲一個線程安全的單例類。 但是如果我使用這種方法,我沒有線索在哪裏關閉ExecutorService實例,我應該嗎?

這裏是主要問題;是否可以保留當前實現:ExecutorService每個用戶存儲在當前會話中的實例作爲屬性?

回答

2

每個用戶有一個線程池看起來是無稽之談,爲什麼?

您需要使用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 
} 
... 
} 
相關問題