2017-07-03 11 views
0

私たちはマルチユーザトークンベースのJSPアプリケーションを持っています。 すべてのセッションを専用のクラスSessionManagerで管理しています。 新しいユーザーがアプリケーションページ(通常はホームページ)を開くと、後でセッションを初期化してマップにキャッシュし、関連付けられたトークンがそれ以上有効でないときにこのセッションを破棄します。だから、我々はSessionManager::initSessionManager::destroyを持っています。マルチユーザJSP J2EEアプリケーションでExecutorServiceインスタンスを作成してシャットダウン

最近私は、AJAX呼び出しを介してフロントエンドから開始されたいくつかの非同期タスクと、時間のかかる方法について、このアプリケーションでExecutorServiceを導入しました。

ExecutorServiceインスタンスをセッション属性として作成してSessionManager::initに設定し、このインスタンスを(Oracleが推奨するように)SessionManager::destroyにシャットダウンします。このようにして、セッショントークンによって識別されるユーザごとに個別のExecutorServiceインスタンスが存在し、ユーザはアプリケーションを使用する限り存続します。

私はそのようなアーキテクチャに満足していますが、ExecutorServiceインスタンスを属性としてセッションに入れるのはどれだけいいですか。

もう1つの方法は、すべてのユーザーのセッションで使用できるようにExecutorServiceインスタンスを作成して公開することです。スレッドセーフなシングルトンクラスとして実装されている可能性があります。 BUT私はこのアプローチを使用する場合、私はどこでシャットダウンするのか分からないExecutorServiceインスタンスと私はする必要がありますか?

これは主な質問です。現在の実装にとどまっても問題ありません:ExecutorServiceユーザーごとのインスタンスが属性として現在のセッションに格納されていますか?

答えて

2

ユーザーごとに1つのスレッドプールを持つことはナンセンスですが、なぜですか?

あなたは、たとえば(おそらくアプリケーションスコープ)サーブレット・コンテキストが作成および破棄された後、サーバーがそれを呼び出した

ServletContextListenerを使用する必要が

@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 
} 
... 
} 
関連する問題