0

スタンドアロンのJavaアプリでhttpセッションを処理する方法について混乱しています。詳細は次のとおりです。

Javaクライアントは、3つのTomcat7サーブレットに接続します。クライアントが起動すると、2つのスケジュールされたスレッド/ダウンローダーとアップローダー/が3分ごとに2つのサーブレットをポーリングします。これらは両方とも、それぞれのクラスのプライベートフィールドでjsessionidCookieを取得して保存します。これにより、Tomcatの2つのセッションがWebアプリケーションの存続期間中に再利用されます。ここまでは順調ですね。

上記のスレッドと同様にセッションを取得して保存するスレッド化された「WebDispather」クラスの複数のインスタンスを使用する3番目のサービス/3番目のサーブレットに接続されていますが、今回はプライベート静的フィールドにあります。ディスパッチャは頻繁に使用されます。負荷によっては、150ものインスタンスが同時に実行される場合があります。ディスパッチャスレッドは、サーブレットに1秒程度ヒットします。

ディスパッチャのsessionidフィールドを非静的にすると、インスタンスごとにセッションが作成されます-良くありません。

すべてのディスパッチャスレッドを同じTomcathttpセッションにバインドすることの意味は何ですか?

ありがとうございました


編集:dispatherは同じセッションにバインドされたスレッドをスレッド化しますが、セッション自体は情報を保持しません。サーブレットはリクエストパラメータのみを処理します。つまり、ディスパッチャ1:

localhost / messagecontrol?id = 123&state

ディスパッチャスレッド2:localhost / messagecontrol?id = 123&state = finish

//サーブレットはIDと状態を処理して忘れます

4

1 に答える 1

0

私が見る限り、すべてのクライアントスレッドが同じセッション情報を共有することを意味します。共有することを意図していない情報がある場合、これはコードのバグになります。

作成されるスレッドの数(パフォーマンスの観点から)が心配な場合は、コードにスレッドプールを実装することを検討してください。

于 2012-12-14T00:17:22.630 に答える