はじめに
こんばんわ、きりです。
本記事はNablarchを使ってみようのサブ記事として作成しております。
第一回では、Nablarchバッチアプリケーションのテンプレートプロジェクトをダウンロードし、動作確認を行いました。
今回は、テンプレートプロジェクトの実行の流れやバッチの内容について整理し、理解を深めたいと思います。
本記事以外のコンテンツはこちらから閲覧可能です。
なるべく、初心者目線で作成するつもりですが、分かりづらい部分ありましたら、コメント頂きたいです。
動作環境
種類 | バージョン |
---|---|
OS | Windows Professional 20H2 |
Eclipse | 2022 Full Edition |
※Eclipseのダウンロードについては、こちらの記事をご確認ください。
本記事の内容
- バッチ実行の流れ
- サンプルコードについて
バッチ実行の流れ
第一回では、以下の2つの方法でバッチを実行した。
- Mavenのexec:javaでの実行
- 実行アプリケーションからの実行
設定方法が違うものの、どちらも以下の共通がありました。
- メインクラスに「nablarch.fw.launcher.Main」をしている
- -diConfig,-requestPath,-userIdの3つの引数をしている
nablarch.fw.launcher.Mainについて
「nablarch.fw.launcher.Main」はテンプレートプロジェクトに存在するクラスではなく、nablarch-fw-standalone.jarという別のjarファイルに存在するクラスです。こちらのドキュメントによれば、上記のMainクラスを実行することで、引数指定したバッチ処理を実行してくれるだけでなく、リクエストの実行の前後でログ出力や初期化処理などを実行してくれているようです。
本記事後半で、もう少し詳しく記載します。
-diConfig,-requestPath,-userIdの3つの引数について
こちらのドキュメントによれば、これらの引数は必ず指定する必要があり、指定する内容は以下の通りです。
パラメータ名 | 内容 | 例 |
---|---|---|
-diConfig | システムリポジトリの設定ファイルのパスを指定する。 このオプションで指定されたパスを使ってシステムリポジトリを初期化する。 |
batch-boot.xml |
-requestPath | 実行するアクションとリクエストIDを指定する。 実行するアクションのクラス名/リクエストIDのように指定する。 リクエストIDは省略可能なようです。 |
SampleBatch |
-userId | ユーザIDを設定する。 この値はセッションコンテキスト変数に user.id という名前で格納される。 | batch_user |
サンプルコードについて
第一回では、テンプレートとして用意されたプロジェクトに対して以下の2つリクエストを行いました。
- SampleBatch(「バッチ処理を実行してみる」で呼び出しているアクション)
- SampleResiBatch(「バッチ処理を実行してみる②」で呼び出しているアクション)
SampleBatch
SampleBatchの処理は以下のjavaファイルに記載されている
./src/main/java/com/example/SampleBatch.java
-requestPathに「SampleBatch」というアクションクラス名を指定することで、SampleBatchの処理が実行されるようです。
どうやらリクエストIDは必須ではないようですね。。。。
SampleBatchクラスはNoInputDataBatchActionクラスを継承しており、ファイルをDBなどの入力情報を必要としないクラスとして実装されています。
また、NoInputDataBatchActionクラスでは、
initialize() <-- 本処理開始前に一度だけ呼ばれる。
try {
handle() <-- 1度だけ呼ばれる。
} catch(e) {
error() <-- 本処理がエラー終了した場合に、一度だけ呼ばれる。
} finally {
terminate() <-- 本処理が全て終了した後、一度だけ呼ばれる。
}
上記、4つのメソッドが呼び出されることが想定されており、必要に応じてOverrideしてコードを実装する必要があります。
※Overrideと聞いてよくわからない場合は、「java クラス 継承 Override」などの検索キーワードで調べてみることをオススメします。
SampleBatchではhandleメソッドのみをOverrideして定義しています。
何いってんの?となった人のために、もっと手前の話から説明します。
nablarch.fw.launcher.Main実行時の処理の流れ
Nablarchバッチアプリケーションの構成に記載されている通り、javaコマンドより実行されたMainクラスは初期化処理実施後、ハンドラキューを呼び出します。
ハンドラキューの話は、別の機会に説明するとして、ハンドラキューの処理の中でinitilize関数やhandle関数が呼び出されます。
逆に言えば、呼ばれる関数が決まっているので、自作でアクションを作成する際は、initilize関数やhandle関数などの関数を必要に応じて、Overrideして実装すれば良いことになります。
handle関数の処理で行っていること
アクションクラスを実装する際によく使うクラスを使ってエラーにならないことを確認しているようです。
テストコードのようで、文字列定義やコード定義の参照方法など、業務ロジックで必要となる処理が記載されているので、
参考になりました。
大体以下のことをしています。
- loggerクラスを使ったログ出力
- FileRecordWriterHolderクラスを使った、ファイルのオープンとWrite
- MessageUtilクラスを使った、メッセージ定義の取得
- CodeUtilクラスを使った、コード定義の取得
なお、文字列定義やコード定義については別の記事でまとめる機会があればと思います。
SampleResiBatch
SampleResiBatchの処理は以下のjavaファイルに記載されている
./src/main/java/com/example/SampleResiBatch.java
こちらはSampleBatchに比べ、継承しているクラスが異なるようで、BatchActionクラスを継承しています。
BatchActionクラスはこちらにもあるように、汎用的なバッチアクションに使用するようです。
サンプルではデータベースのレコードを抽出して、handleメソッドの引数に利用しているようです。
BatchActionのリファレンスにもあるように、順番としては、createReadrメソッド→handleメソッド→transactionSuccess Or transactionFailureメソッドの流れでフレームワークから呼び出されているようです。
createReaderではレコード抽出のSQL文を設定し、抽出した結果のレコード毎にhandleメソッドを呼び出しており、handleメソッドの処理が成否により、transactionSuccess or transactionFailureメソッドが呼び出され、対象のレコードのSTATUS列の値を変更しています。
SQL文の実行やその内容については、また別の記事にて整理したいと思います。
また、テンプレートプロジェクトではH2データベースがデフォルトで設定されており、こちらの記事を参考に、現状のデータベースの状態を確認してほしい。
最後に
実用的な処理ではないですが、サンプルコードなだけあったNablarchのバッチはこう書くんだよと、言ってるようなコードでした。
個人的にはとても参考になりました。