2017-03-21 12 views
-1

私は2台のサーバーを持っています。 サーバAにはトリガ条件が設定されており、サーバBをサーブレットで呼び出します。Java HttpSessionは実行時に変更できますか?

サーバBでは、サーバAのコールを受信すると、HttpSessionにサーバ情報を格納してから新しいスレッドを開始しますサーバーBのスレッドがHttpSessionに到達したときに、以前に設定された値が異なることがありました。彼らはヌルでも空白でもなく、正確な値を持っていますが、私が入れた値はありません。

サーバーAは、5分ごとに30件の通知を発生します。これは私がいくつかの同時スレッドを持つことを意味します。

なぜHttpSessionは別のスレッドによってオーバーライドされていますか?

+1

なぜ最初にセッションを使用していますか?スレッドが必要とする情報をRunnableのコンストラクタに渡すのはなぜですか? –

+0

ユーザーがシステムにログインすると、httpセッションにユーザーの資格情報が保存されます。 サーバーAが通知を送信すると、通知が送信され、ログインとして機能します。これは、HttpSessionで登録する情報です。 しかし、場合によっては、ユーザー情報が変更されたことに気付きました。 –

答えて

0

V 3.0は言うサーブレット仕様のセクション2.3.3.4、

は、アプリケーションによって作成されたスレッドは、要求または応答[またはセッション】オブジェクト、もののようなコンテナ管理 オブジェクトを使用する場合オブジェクト は、オブジェクトのライフサイクル[...]内でのみアクセスする必要があります。

HttpSessionオブジェクトはコンテナ管理オブジェクトですが、そのライフサイクルはサーブレット仕様で明確に定義されていません。しかし、セッションが無効にされたときに、明示的にまたはタイムアウトによってライフサイクルが終了し、そのセッションに属する要求が処理されていない場合、ライフサイクルを終了すると考えられることは考えられます。その後、セッションオブジェクトに引き続きアクセスすると、すべてのベットはオフになります。特に、コンテナは、セッションオブジェクトを含む管理オブジェクトをキャッシュして再利用することが許可されています。

サーバーAがセッショントラッキングに参加していない場合、すべての要求は新しいセッションに割り当てられ、各セッションの有効期間は1つのタイムアウト期間になります。この場合、セッションが1回の計算中にタイムアウトしないように、[default]タイムアウトを十分に長く設定することを検討できます(ただし、下記参照)。一方、サーバA をセッショントラッキングに参加させている場合、セッションオブジェクトは各要求に対して変更可能になります。

サーバーAがセッショントラッキングに参加するかどうかに関わらず、コンテナ管理オブジェクトにアクセスするために手動で起動するアプリケーションスレッドなどのアプリケーションスレッドにとっては、フォームが不適切です。データを提供するためには、別の仕組みを使用する方が良いでしょう。

+0

あなたの答えに基づいて、セッションに情報を格納する必要性について現在のアーキテクチャーを担当するプログラマーに質問しました。 彼の応答は基本的に「すべての要求が新しいセッションを作成するので、HttpSession要素の再利用はありません」 しかし、この記事の後に行われた調査では、その反対が証明されます。 あなたが言ったように、セッションオブジェクトは再利用されています。 サーブレットに入るとき。私は、セッションがすでに入力されていることを識別します。 今私はこの問題を解決する必要があります。あなたの答えに感謝します。 感謝しています –

関連する問題