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