Package nablarch.fw.reader
Class DatabaseTableQueueReader
java.lang.Object
nablarch.fw.reader.DatabaseTableQueueReader
- All Implemented Interfaces:
DataReader<SqlRow>
データベースのテーブルを擬似的にキューのように扱うデータリーダ。
本リーダはデータベースのテーブルをキューのように扱えるようにするため、
処理対象レコードが存在しない場合でも
hasNext(nablarch.fw.ExecutionContext)
は
常にtrue
を返却し、処理対象が存在するように振る舞う。
これにより、データが存在しない場合でもread(nablarch.fw.ExecutionContext)
が呼び出され、
テーブルの最新情報を取得し直すことが可能となる。
本リーダは、処理対象レコードが存在しない場合、再度最新の情報を取得する。
この際に、他のスレッドで処理中のレコードが未処理のまま残っている可能性がある。
このため、各スレッドで処理中のレコードをヒープ上に保持し、
読み込んだ対象が他のスレッドで処理中のレコードではないことを確認する。
対象のレコードが、他のスレッドで処理中である場合には、次のレコードを読み込み再度チェックを行う。
対象のレコードが、他のスレッドで処理中でない場合には、読み込んだレコードをクライアントに返却する。- Author:
- hisaaki sioiri
- See Also:
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic class
リクエストを識別するオブジェクト。Nested classes/interfaces inherited from interface nablarch.fw.DataReader
DataReader.NoMoreRecord
-
Constructor Summary
ConstructorDescriptionDatabaseTableQueueReader
(DatabaseRecordReader originalReader, int waitTime, String... primaryKeys) データベースをキューとして扱うリーダを生成する。 -
Method Summary
Modifier and TypeMethodDescriptionvoid
close
(ExecutionContext ctx) このリーダの利用を停止し、内部的に保持している各種リソースを解放する。オリジナルのリーダ(DatabaseRecordReader
)を取得する。boolean
hasNext
(ExecutionContext ctx) 次に読み込むデータが存在するかどうかを返却する。read
(ExecutionContext ctx) 次のレコードを読み込み返却する。protected void
writeLog
(DatabaseTableQueueReader.InputDataIdentifier inputDataIdentifier) 要求の識別情報をログに出力する。
-
Constructor Details
-
DatabaseTableQueueReader
@Published public DatabaseTableQueueReader(DatabaseRecordReader originalReader, int waitTime, String... primaryKeys) データベースをキューとして扱うリーダを生成する。- Parameters:
originalReader
- データベースレコードリーダwaitTime
- データが存在しない場合の待機時間(ミリ秒)primaryKeys
- レコードを一意に識別する主キーのカラム名
-
-
Method Details
-
read
次のレコードを読み込み返却する。 本実装では、次のレコードが存在しない場合(カーソルの終端に達した場合)、 カーソルを再度開き直し最新の情報を取得後にレコードを読み込み返却する。 読み込んだレコードが他スレッドで処理中のデータの場合には、 そのレコードを読み飛ばし、他のスレッドが処理していないレコードを返却する。 次に読み込むレコードが存在しない場合はnull
を返却する。- Specified by:
read
in interfaceDataReader<SqlRow>
- Parameters:
ctx
- 実行コンテキスト- Returns:
- レコード
-
writeLog
@Published protected void writeLog(DatabaseTableQueueReader.InputDataIdentifier inputDataIdentifier) 要求の識別情報をログに出力する。 識別情報に個人情報等のようにログに出力すべきではない項目が含まれる場合には、 本メソッドをオーバーライドしマスク処理などを実施後にログ出力を行うこと。- Parameters:
inputDataIdentifier
- 要求識別情報
-
hasNext
次に読み込むデータが存在するかどうかを返却する。 本実装ではデータベース上に処理対象データが無くなった場合でも処理を継続するため、常にデータ有りtrue
を返す。
このリーダが閉じられた場合はfalse
を返す。- Specified by:
hasNext
in interfaceDataReader<SqlRow>
- Parameters:
ctx
- 実行コンテキスト- Returns:
- 読み込むデータが存在する場合
true
-
close
このリーダの利用を停止し、内部的に保持している各種リソースを解放する。- Specified by:
close
in interfaceDataReader<SqlRow>
- Parameters:
ctx
- 実行コンテキスト
-
getOriginalReader
オリジナルのリーダ(DatabaseRecordReader
)を取得する。 本メソッドは、以下の理由によりプロダクションコードからの呼び出しは推奨しない。
オリジナルリーダを取得すること自体は問題ないが、取得したオリジナルのリーダを操作してしまうと、 本リーダ内で保持しているオリジナルのリーダの状態も変更されてしまうため。- Returns:
- オリジナルのリーダ
-