Class DatabaseTableQueueReader

java.lang.Object
nablarch.fw.reader.DatabaseTableQueueReader
All Implemented Interfaces:
DataReader<SqlRow>

public class DatabaseTableQueueReader extends Object implements DataReader<SqlRow>
データベースのテーブルを擬似的にキューのように扱うデータリーダ。

本リーダはデータベースのテーブルをキューのように扱えるようにするため、 処理対象レコードが存在しない場合でもhasNext(nablarch.fw.ExecutionContext)は 常にtrueを返却し、処理対象が存在するように振る舞う。 これにより、データが存在しない場合でもread(nablarch.fw.ExecutionContext)が呼び出され、 テーブルの最新情報を取得し直すことが可能となる。

本リーダは、処理対象レコードが存在しない場合、再度最新の情報を取得する。 この際に、他のスレッドで処理中のレコードが未処理のまま残っている可能性がある。 このため、各スレッドで処理中のレコードをヒープ上に保持し、 読み込んだ対象が他のスレッドで処理中のレコードではないことを確認する。

対象のレコードが、他のスレッドで処理中である場合には、次のレコードを読み込み再度チェックを行う。 対象のレコードが、他のスレッドで処理中でない場合には、読み込んだレコードをクライアントに返却する。

Author:
hisaaki sioiri
See Also:
  • Constructor Details

    • DatabaseTableQueueReader

      @Published public DatabaseTableQueueReader(DatabaseRecordReader originalReader, int waitTime, String... primaryKeys)
      データベースをキューとして扱うリーダを生成する。
      Parameters:
      originalReader - データベースレコードリーダ
      waitTime - データが存在しない場合の待機時間(ミリ秒)
      primaryKeys - レコードを一意に識別する主キーのカラム名
  • Method Details

    • read

      public SqlRow read(ExecutionContext ctx)
      次のレコードを読み込み返却する。

      本実装では、次のレコードが存在しない場合(カーソルの終端に達した場合)、 カーソルを再度開き直し最新の情報を取得後にレコードを読み込み返却する。

      読み込んだレコードが他スレッドで処理中のデータの場合には、 そのレコードを読み飛ばし、他のスレッドが処理していないレコードを返却する。

      次に読み込むレコードが存在しない場合はnullを返却する。

      Specified by:
      read in interface DataReader<SqlRow>
      Parameters:
      ctx - 実行コンテキスト
      Returns:
      レコード
    • writeLog

      @Published protected void writeLog(DatabaseTableQueueReader.InputDataIdentifier inputDataIdentifier)
      要求の識別情報をログに出力する。

      識別情報に個人情報等のようにログに出力すべきではない項目が含まれる場合には、 本メソッドをオーバーライドしマスク処理などを実施後にログ出力を行うこと。

      Parameters:
      inputDataIdentifier - 要求識別情報
    • hasNext

      public boolean hasNext(ExecutionContext ctx)
      次に読み込むデータが存在するかどうかを返却する。

      本実装ではデータベース上に処理対象データが無くなった場合でも処理を継続するため、常にデータ有りtrueを返す。
      このリーダが閉じられた場合はfalseを返す。

      Specified by:
      hasNext in interface DataReader<SqlRow>
      Parameters:
      ctx - 実行コンテキスト
      Returns:
      読み込むデータが存在する場合 true
    • close

      public void close(ExecutionContext ctx)
      このリーダの利用を停止し、内部的に保持している各種リソースを解放する。
      Specified by:
      close in interface DataReader<SqlRow>
      Parameters:
      ctx - 実行コンテキスト
    • getOriginalReader

      public DatabaseRecordReader getOriginalReader()
      オリジナルのリーダ(DatabaseRecordReader)を取得する。

      本メソッドは、以下の理由によりプロダクションコードからの呼び出しは推奨しない。
      オリジナルリーダを取得すること自体は問題ないが、取得したオリジナルのリーダを操作してしまうと、 本リーダ内で保持しているオリジナルのリーダの状態も変更されてしまうため。

      Returns:
      オリジナルのリーダ