Class AsyncMessageSendAction

All Implemented Interfaces:
DataReaderFactory<SqlRow>, Handler<SqlRow,Result>, ExecutionHandlerCallback<CommandLine,Result>, TransactionEventCallback<SqlRow>

@Published(tag="architect") public class AsyncMessageSendAction extends BatchAction<SqlRow>
MQ応答なし送信用の共通アクション。

本クラスでは、送信用のテーブル(一時テーブル)から送信対象のデータを取得し、メッセージを送信する。

送信対象のメッセージのリクエストIDは、本バッチの起動時の引数(起動パラメータ名:messageRequestId)として指定すること。

送信対象のデータを抽出するSQL文は、テーブル単位に用意する必要がある。 詳細は、createStatement()を参照

メッセージが正常に送信できた場合には、#transactionNormalEnd(nablarch.core.db.statement.SqlRow, nablarch.fw.ExecutionContext)にて 対象データのステータスを処理済みに更新する。

メッセージ送信時に例外が発生した場合には、#transactionAbnormalEnd(Throwable, nablarch.core.db.statement.SqlRow, nablarch.fw.ExecutionContext)にて 対象データのステータスをエラーに更新する。

Author:
hisaaki sioiri
  • Constructor Details

    • AsyncMessageSendAction

      public AsyncMessageSendAction()
  • Method Details

    • initialize

      protected void initialize(CommandLine command, ExecutionContext context)
      初期処理を行う。

      起動引数から送信対象のメッセージのリクエストIDを取得し、保持する。

      Overrides:
      initialize in class BatchActionBase<SqlRow>
      Parameters:
      command - 起動コマンドライン
      context - 実行コンテキスト
    • handle

      public Result handle(SqlRow inputData, ExecutionContext ctx)
      入力データからヘッダ部及び業務データ部からなるメッセージオブジェクトを生成し、 送信処理(キューへのPUT)を行う。

      処理詳細は、以下のとおり。

      1. ヘッダ部は、createHeaderRecord(nablarch.core.db.statement.SqlRow)で生成する。
      2. 業務データ部は、インプットデータ(本メソッドの引数)をそのまま使用する。
      3. 送信先のキューは、getQueueName()から取得する。
      Specified by:
      handle in interface Handler<SqlRow,Result>
      Specified by:
      handle in class BatchAction<SqlRow>
      Parameters:
      inputData - 入力データ
      ctx - 実行コンテキスト
      Returns:
      処理結果情報オブジェクト
    • transactionNormalEnd

      public void transactionNormalEnd(SqlRow inputData, ExecutionContext ctx)
      インプットテーブルの対象レコードのステータスを処理済みに更新する。 これにより、次回対象データ抽出時に処理済みのレコードは対象外となり、 2重送信を防止する事が出来る。

      ステータスを更新するSQL文は、getSqlResource()で取得した SQLリソース内に記述されたSQL_ID=UPDATE_NORMAL_ENDを使用する。

      Specified by:
      transactionNormalEnd in interface TransactionEventCallback<SqlRow>
      Overrides:
      transactionNormalEnd in class BatchActionBase<SqlRow>
      Parameters:
      inputData - 入力データ
      ctx - 実行コンテキスト
    • transactionAbnormalEnd

      public void transactionAbnormalEnd(Throwable e, SqlRow inputData, ExecutionContext ctx)
      インプットテーブルの対象レコードのステータスをエラーに更新する。 これにより、エラーレコードを再度送信することを防止する事ができる。

      (エラーレコードは、何度送信してもエラーになることが考えられるため ステータスをエラーに変更する必要がある。)

      ステータスを更新するSQL文は、getSqlResource()で取得した SQLリソース内に記述されたSQL_ID=UPDATE_ABNORMAL_ENDを使用する。

      Specified by:
      transactionAbnormalEnd in interface TransactionEventCallback<SqlRow>
      Overrides:
      transactionAbnormalEnd in class BatchActionBase<SqlRow>
      Parameters:
      e - 発生したエラー
      inputData - 入力データ
      ctx - 実行コンテキスト
    • updateStatus

      protected void updateStatus(SqlRow inputData, String sqlId)
      ステータスを更新する。

      指定されたインプットデータ、SQL_IDを元にステータスを更新する。 ステータスを更新するためのFormクラスは、nablarch.fw.messaging.action.AsyncMessageSendActionSettings#getFormClassName() から取得したFormクラスを使用して行う。

      Parameters:
      inputData - インプットデータ
      sqlId - SQL_ID
    • createReader

      public DataReader<SqlRow> createReader(ExecutionContext ctx)
      送信対象のデータを抽出するためのDatabaseRecordReaderを生成する。 DatabaseRecordReader生成時に指定するSqlPStatementは、 #createStatement()により生成する。
      Specified by:
      createReader in interface DataReaderFactory<SqlRow>
      Specified by:
      createReader in class BatchAction<SqlRow>
      Parameters:
      ctx - 実行コンテキスト
      Returns:
      データリーダ
    • createStatement

      protected SqlPStatement createStatement()
      インプットデータを抽出するためのSqlPStatementを生成する。

      SqlPStatementを生成するためのSQLは、下記ルールに従い取得する。

    • SQLリソースは、getSqlResource()の実装に準拠する
    • SQL_IDは、SELECT_SEND_DATA固定
    • Returns:
      SqlPStatement
    • getSqlResource

      protected String getSqlResource()
      SQLリソース名称を取得する。

      返却するSQLリソース名称は、「nablarch.fw.messaging.action.AsyncMessageSendActionSettings#getSqlFilePackage() + "." + バッチ起動時に指定した送信メッセージのメッセージリクエストID」となる。

      Returns:
      SQLリソース名称
      See Also:
    • getSettings

      protected AsyncMessageSendActionSettings getSettings()
      本アクションを実行するために必要となる設定値を保持するオブジェクトを取得する。

      デフォルト動作では、リポジトリ(SystemRepository)から設定オブジェクトを取得する。

      Returns:
      設定オブジェクト
    • createHeaderRecordFormatter

      protected DataRecordFormatter createHeaderRecordFormatter()
      ヘッダ部のフォーマットを生成する。

      ヘッダ部を表すフォーマット定義ファイル名は、getHeaderFormatName()より取得する。

      Returns:
      生成したフォーマッタ
    • getHeaderFormatName

      protected String getHeaderFormatName()
      ヘッダ部のフォーマット定義ファイル名を取得する。

      ヘッダ部のフォーマット定義ファイル名は、nablarch.fw.messaging.action.AsyncMessageSendActionSettings#getHeaderFormatName() から取得した値となる。

      Returns:
      フォーマット定義ファイル名
      See Also:
    • createHeaderRecord

      protected Map<String,Object> createHeaderRecord(SqlRow inputData)
      ヘッダデータを生成する。

      ヘッダ部に設定する項目は以下のとおり。

      • リクエストIDを設定するフィールド(項目名:requestId)があること。 リクエストID部には、バッチ起動時に指定された送信メッセージのメッセージIDを設定する。
      • リクエストID以外の項目は、任意の項目を設定することが可能である。 設定する項目は、nablarch.fw.messaging.action.AsyncMessageSendActionSettings#getHeaderItemList()から取得した項目となり、 設定する値はhandle(nablarch.core.db.statement.SqlRow, nablarch.fw.ExecutionContext)のインプットデータから取得する。
      Parameters:
      inputData - 入力データ
      Returns:
      生成したヘッダ情報
    • createDataRecordFormatter

      protected DataRecordFormatter createDataRecordFormatter()
      データ部のフォーマッタ生成する。
      Returns:
      生成したフォーマッタ
    • getQueueName

      protected String getQueueName()
      送信キュー名を取得する。
      Returns:
      送信キュー名
    • getFormatDir

      protected String getFormatDir()
      フォーマット定義ファイルの配置ディレクトリを示す論理名を取得する。
      Returns:
      フォーマット定義ファイルの配置ディレクトリ(論理名)
    • createFormInstance

      protected Object createFormInstance(Map<String,?> inputData)
      送信用一時テーブルを更新するためのFormオブジェクトを生成する。
      Parameters:
      inputData - Formインスタンスを生成するためのインプットデータ
      Returns:
      生成したFormクラスのインスタンス