Nablarchを使ったバッチアプリケーションの作成-その２-

# はじめに
こんばんわ、きりです。
本記事は[Nablarchを使ってみよう](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17)のサブ記事として作成しております。

[第一回](https://qiita.com/kirin1218/items/eb3033ecb1520b497cc2)では、Nablarchバッチアプリケーションのテンプレートプロジェクトをダウンロードし、動作確認を行いました。
今回は、テンプレートプロジェクトの実行の流れやバッチの内容について整理し、理解を深めたいと思います。

本記事以外のコンテンツは[こちら](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17#nablarch%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7)から閲覧可能です。

なるべく、初心者目線で作成するつもりですが、分かりづらい部分ありましたら、コメント頂きたいです。

# 動作環境
|種類|バージョン|
|---|---|
|OS|Windows Professional 20H2|
|Eclipse|2022 Full Edition|

※Eclipseのダウンロードについては、[こちら](https://qiita.com/kirin1218/items/02bfeb333335842c56ae)の記事をご確認ください。

# 本記事の内容
* バッチ実行の流れ
* サンプルコードについて

# バッチ実行の流れ
第一回では、以下の2つの方法でバッチを実行した。
* Mavenのexec:javaでの実行
* 実行アプリケーションからの実行

設定方法が違うものの、どちらも以下の共通がありました。
* メインクラスに「nablarch.fw.launcher.Main」をしている
* -diConfig,-requestPath,-userIdの３つの引数をしている

## nablarch.fw.launcher.Mainについて
「nablarch.fw.launcher.Main」はテンプレートプロジェクトに存在するクラスではなく、nablarch-fw-standalone.jarという別のjarファイルに存在するクラスです。[こちら](https://nablarch.github.io/docs/5u20/doc/application_framework/application_framework/handlers/standalone/main.html)のドキュメントによれば、上記のMainクラスを実行することで、引数指定したバッチ処理を実行してくれるだけでなく、リクエストの実行の前後でログ出力や初期化処理などを実行してくれているようです。

本記事後半で、もう少し詳しく記載します。

## -diConfig,-requestPath,-userIdの３つの引数について
[こちら](https://nablarch.github.io/docs/5u20/doc/application_framework/application_framework/handlers/standalone/main.html)のドキュメントによれば、これらの引数は必ず指定する必要があり、指定する内容は以下の通りです。
|パラメータ名|内容|例|
|---|---|---|
|-diConfig|システムリポジトリの設定ファイルのパスを指定する。 <br>このオプションで指定されたパスを使ってシステムリポジトリを初期化する。|batch-boot.xml|
|-requestPath|実行するアクションとリクエストIDを指定する。<br>実行するアクションのクラス名/リクエストIDのように指定する。<br>リクエストIDは省略可能なようです。|SampleBatch|
|-userId|ユーザIDを設定する。 この値はセッションコンテキスト変数に user.id という名前で格納される。|batch_user|


# サンプルコードについて
[第一回](https://qiita.com/kirin1218/items/eb3033ecb1520b497cc2)では、テンプレートとして用意されたプロジェクトに対して以下の2つリクエストを行いました。
1. SampleBatch(「バッチ処理を実行してみる」で呼び出しているアクション)
2. SampleResiBatch(「バッチ処理を実行してみる②」で呼び出しているアクション)

## SampleBatch
SampleBatchの処理は以下のjavaファイルに記載されている
./src/main/java/com/example/SampleBatch.java

-requestPathに「SampleBatch」というアクションクラス名を指定することで、SampleBatchの処理が実行されるようです。
どうやらリクエストIDは必須ではないようですね。。。。

SampleBatchクラスはNoInputDataBatchActionクラスを継承しており、ファイルをDBなどの入力情報を必要としないクラスとして実装されています。
また、[NoInputDataBatchActionクラス](https://nablarch.github.io/docs/LATEST/javadoc/nablarch/fw/action/NoInputDataBatchAction.html)では、
```
initialize()              <-- 本処理開始前に一度だけ呼ばれる。
 try {
   handle()                <-- 1度だけ呼ばれる。
 } catch(e) {
   error()                 <-- 本処理がエラー終了した場合に、一度だけ呼ばれる。
 } finally {
   terminate()             <-- 本処理が全て終了した後、一度だけ呼ばれる。
 }
```
上記、４つのメソッドが呼び出されることが想定されており、必要に応じてOverrideしてコードを実装する必要があります。
※Overrideと聞いてよくわからない場合は、「java クラス　継承 Override」などの検索キーワードで調べてみることをオススメします。

SampleBatchではhandleメソッドのみをOverrideして定義しています。

何いってんの？となった人のために、もっと手前の話から説明します。

### nablarch.fw.launcher.Main実行時の処理の流れ
[Nablarchバッチアプリケーションの構成](https://nablarch.github.io/docs/5u20/doc/application_framework/application_framework/batch/nablarch_batch/architecture.html#nablarch)に記載されている通り、javaコマンドより実行されたMainクラスは初期化処理実施後、ハンドラキューを呼び出します。
ハンドラキューの話は、別の機会に説明するとして、ハンドラキューの処理の中でinitilize関数やhandle関数が呼び出されます。
逆に言えば、呼ばれる関数が決まっているので、自作でアクションを作成する際は、initilize関数やhandle関数などの関数を必要に応じて、Overrideして実装すれば良いことになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/fb74e7d4-b846-b56f-a35e-36de73eb37ee.png)

## handle関数の処理で行っていること
アクションクラスを実装する際によく使うクラスを使ってエラーにならないことを確認しているようです。
テストコードのようで、文字列定義やコード定義の参照方法など、業務ロジックで必要となる処理が記載されているので、
参考になりました。

大体以下のことをしています。
* loggerクラスを使ったログ出力
* FileRecordWriterHolderクラスを使った、ファイルのオープンとWrite
* MessageUtilクラスを使った、メッセージ定義の取得
* CodeUtilクラスを使った、コード定義の取得

なお、文字列定義やコード定義については別の記事でまとめる機会があればと思います。

## SampleResiBatch
SampleResiBatchの処理は以下のjavaファイルに記載されている
./src/main/java/com/example/SampleResiBatch.java

こちらはSampleBatchに比べ、継承しているクラスが異なるようで、BatchActionクラスを継承しています。
BatchActionクラスは[こちら](https://nablarch.github.io/docs/5u20/doc/application_framework/application_framework/batch/nablarch_batch/architecture.html#nablarch-batch-action)にもあるように、汎用的なバッチアクションに使用するようです。
サンプルではデータベースのレコードを抽出して、handleメソッドの引数に利用しているようです。

[BatchActionのリファレンス](https://nablarch.github.io/docs/LATEST/javadoc/nablarch/fw/action/BatchAction.html)にもあるように、順番としては、createReadrメソッド→handleメソッド→transactionSuccess Or transactionFailureメソッドの流れでフレームワークから呼び出されているようです。

createReaderではレコード抽出のSQL文を設定し、抽出した結果のレコード毎にhandleメソッドを呼び出しており、handleメソッドの処理が成否により、transactionSuccess　or　transactionFailureメソッドが呼び出され、対象のレコードのSTATUS列の値を変更しています。

SQL文の実行やその内容については、また別の記事にて整理したいと思います。

また、テンプレートプロジェクトではH2データベースがデフォルトで設定されており、[こちらの記事](https://qiita.com/kirin1218/items/fc73ef052869248cbf66)を参考に、現状のデータベースの状態を確認してほしい。

# 最後に
実用的な処理ではないですが、サンプルコードなだけあったNablarchのバッチはこう書くんだよと、言ってるようなコードでした。
個人的にはとても参考になりました。

# 参考URL
* [Nablarchバッチプロジェクトの初期セットアップ](https://nablarch.github.io/docs/LATEST/doc/application_framework/application_framework/blank_project/setup_blankProject/setup_NablarchBatch.html#nablarch)