|
||||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Objectjp.terasoluna.fw.web.thin.SessionLockControlFilter
public class SessionLockControlFilter
同一セッションの処理の同期化を行う。
同一セッションの処理を複数スレッドで同時に実行したくない場合に、このフィルタを使用する。
セッションスコープのアクションフォームを使用する場合、同一セッションの処理を複数スレッドで同時に実行すべきではないため、このフィルタを使用する。
(セッションスコープのアクションフォームを使用する場合、同一セッションの処理を複数スレッドで同時に実行されると、入力値検証が通った後、ActionやBLogicの処理に移る前に、アクションフォームが書き換えられる可能性がある。)
このフィルタでは、2つのロック方式を提供している。
LimitedLock
によるロック(ロック待ちスレッドが増えた際に、古いロック待ちスレッドを中断する機能を持つロック)LimitedLock
(しきい値=2)によるロックを使用する。LimitedLock
のロック方式やしきい値、このロック方式の存在意義は、LimitedLock
を参照のこと。
LimitedLock
のしきい値の変更や、synchronizedブロックによるロック方式への切り替えは、このフィルタの初期化パラメータthresholdにて行う。
threshold≧0の場合は、thresholdの値をしきい値として使用し、LimitedLock
によるロックを行う。
threshold<0の場合は、synchronizedブロックによるロックを行う。
※thresholdには整数値を設定すること。
LimitedLock
の機能により、ロック待ちが中断されたスレッドでは、レスポンスとして、特定のレスポンスコードを返すことができる。また、デプロイメントディスクリプタに<error-page>要素を記述することにより、
レスポンスコードに対応するエラーページを割り当てることができる。
ただし、ユーザが同一セッションで複数ウィンドウを操作しない限り、ロック待ちが中断されたスレッドにて、レスポンスに何を返しても、ユーザには見えない。
(最新のリクエストに対するレスポンスだけがブラウザに表示されるが、最新のリクエストを処理しようとしているスレッドは中断対象にならない。ロック待ちが中断されたスレッドは、古いリクエストを処理するものであり、ブラウザはそのレスポンスを無視する。)
デフォルトでは、ロック待ち中断時のレスポンスコードは503(過負荷状態で一時的に処理が実行できない状態であることを表すレスポンスコード)となっている。
レスポンスコードの設定は、このフィルタの初期化パラメータinterruptResponseCodeにて行う。
※interruptResponseCodeには整数値を設定すること。また、このクラスでは値の範囲を制限しないが、JavaEEサーバが使用できるレスポンスコードを設定すること。
<filter>
<filter-name>sessionLockControlFilter</filter-name>
<filter-class>jp.terasoluna.fw.web.thin.SessionLockControlFilter</filter-class>
<init-param>
<param-name>interruptResponseCode</param-name>
<param-value>503</param-value>
</init-param>
<init-param>
<param-name>threshold</param-name>
<param-value>2</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>sessionLockControlFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<error-page>
<error-code>503</error-code>
<location>/error.jsp</location>
</error-page>
LimitedLock
フィールドの概要 | |
---|---|
private static int |
DEFAULT_INTERRUPT_RESPONSE_CODE
初期化パラメータinterruptResponseCodeのデフォルト値(503)。 |
private static int |
DEFAULT_THRESHOLD
初期化パラメータthresholdのデフォルト値(2)。 |
private static java.lang.String |
INIT_PARAM_INTERRUPT_RESPONSE_CODE
初期化パラメータ名:interruptResponseCode。 |
private static java.lang.String |
INIT_PARAM_THRESHOLD
初期化パラメータ名:threshold。 |
private int |
interruptResponseCode
初期化パラメータinterruptResponseCode。 |
private java.util.concurrent.ConcurrentHashMap<java.lang.String,SessionLockReference> |
limitedLockMap
LimitedLock の弱参照マップ。 |
private static org.apache.commons.logging.Log |
log
ログクラス。 |
private java.lang.ref.ReferenceQueue<LimitedLock> |
sessionLockRefQueue
セッション同期に用いている LimitedLock の参照キュー。 |
protected int |
threshold
初期化パラメータthreshold。 |
コンストラクタの概要 | |
---|---|
SessionLockControlFilter()
|
メソッドの概要 | |
---|---|
protected LimitedLock |
createLimitedLock()
LimitedLockインスタンスを生成する。 |
void |
destroy()
サービス状態を終えた事をフィルタに伝えるために、コンテナが呼び出す。 |
void |
doFilter(javax.servlet.ServletRequest req,
javax.servlet.ServletResponse res,
javax.servlet.FilterChain chain)
同一セッションの処理の同期化を行う。 |
void |
init(javax.servlet.FilterConfig config)
フィルタがサービス開始状態になる際に、コンテナによって呼び出される。 |
protected void |
lockLimitedLock(javax.servlet.http.HttpServletRequest request,
LimitedLock lock)
LimitedLockのロックを取得する。 |
protected void |
unlockLimitedLock(javax.servlet.http.HttpServletRequest request,
LimitedLock lock)
LimitedLockのロックを解放する。 |
クラス java.lang.Object から継承されたメソッド |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
フィールドの詳細 |
---|
private static final org.apache.commons.logging.Log log
private static final java.lang.String INIT_PARAM_INTERRUPT_RESPONSE_CODE
private static final java.lang.String INIT_PARAM_THRESHOLD
private static final int DEFAULT_INTERRUPT_RESPONSE_CODE
private static final int DEFAULT_THRESHOLD
private int interruptResponseCode
ロック待ち中断時のレスポンスコード。
protected int threshold
0以上のとき、LimitedLock
に渡すしきい値となる。
0未満のとき、LimitedLock
を使用せず、synchronizedブロックを使用する。
private java.lang.ref.ReferenceQueue<LimitedLock> sessionLockRefQueue
LimitedLock
の参照キュー。
セッション同期に用いているLimitedLock
インスタンスが参照されなくなり、ガベージコレクタに回収されるとき、ガベージコレクタによって、 LimitedLock
インスタンスを保持していた
SessionLockReference
がこの参照キューに追加される。
limitedLockMap
内で不要になったエントリーを削除する際に利用する。
private java.util.concurrent.ConcurrentHashMap<java.lang.String,SessionLockReference> limitedLockMap
LimitedLock
の弱参照マップ。
キーはセッションID、値は、LimitedLock
への弱参照であるSessionLockReference
。
あるセッションID用にLimitedLock
インスタンスを用意した場合、SessionLockReference
にラップしてからこのマップにputする。
この、あるセッションID用に用意したLimitedLock
が、いずれかのスレッドで使用中である場合、 このマップから、そのセッションIDをキーにSessionLockReference
が、さらに、
SessionLockReference
から、そのセッションID用のLimitedLock
が取得可能である。
この、あるセッションID用に用意したLimitedLock
を、どのスレッドも参照していないとき、このLimitedLock
はガベージコレクタによって回収可能となる。
LimitedLock
がガベージコレクタに回収された場合、このマップから得られたSessionLockReference
からは、LimitedLock
を得ることができない。
この場合、LimitedLock
が取得できないエントリーが一時的に残るが、sessionLockRefQueueと連携することにより、不要になったエントリーは、じきに削除される。
コンストラクタの詳細 |
---|
public SessionLockControlFilter()
メソッドの詳細 |
---|
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse res, javax.servlet.FilterChain chain) throws java.io.IOException, javax.servlet.ServletException
javax.servlet.Filter
内の doFilter
req
- HTTPリクエストres
- HTTPレスポンスchain
- フィルタチェーン
java.io.IOException
- I/Oエラー
javax.servlet.ServletException
- サーブレット例外Filter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse,
javax.servlet.FilterChain)
protected LimitedLock createLimitedLock()
LimitedLockを拡張した場合、このメソッドをオーバーライドし、LimitedLock拡張クラスのインスタンスを返すよう拡張する。
protected void lockLimitedLock(javax.servlet.http.HttpServletRequest request, LimitedLock lock) throws java.lang.InterruptedException
ロック取得前後に処理を追加する拡張点。
必要に応じて、このメソッドを拡張すること。
拡張例)
レスポンスを返す前に、任意の場所でロックを解放したい場合等、フィルタ以外から、ロックを取得しているLimitedLockにアクセスしたい場合、ここでLimitedLockをリクエスト属性に設定するよう拡張する。
request
- HTTPリクエストlock
- LimitedLockインスタンス
java.lang.InterruptedException
- 現在のスレッドで割り込みが発生した場合(LimitedLockの機能により、ロック待ちが中断された場合を含む)protected void unlockLimitedLock(javax.servlet.http.HttpServletRequest request, LimitedLock lock)
ロック解放前後に処理を追加する拡張点。
必要に応じて、このメソッドを拡張すること。
request
- HTTPリクエストlock
- LimitedLockインスタンスpublic void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException
javax.servlet.Filter
内の init
config
- FilterConfigインスタンス。
javax.servlet.ServletException
- 初期化異常時にスローされる例外。Filter.init(javax.servlet.FilterConfig)
,
AbstractControlFilter
public void destroy()
javax.servlet.Filter
内の destroy
Filter.destroy()
|
||||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |