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

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

今回は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)の記事をご確認ください。

# バッチとは
システムの世界では一定量のデータに対して、一括処理を行うことをいうようです。

バッチの例としては、
・毎月月初にDBなどから各会員の利用料や利用時間などを取得し、その情報をメールで通知する
などが考えられます。

スケジュールするかは任意ですが、システム的な利用タイミングを考えると、スケジューラーと組み合わせて実行されるケースが多いかなと思います。

# バッチアプリケーションとは
バッチ処理を実行する（仕組みをもった）アプリケーションです。
Nablarchにはバッチ処理を行う仕組みが予め用意されています。

# 作業内容
1. バッチアプリケーションのテンプレートプロジェクトをダウンロードする
2. テンプレートプロジェクトの動作確認を行う

# バッチアプリケーションのテンプレートプロジェクトをダウンロードする
## テンプレートプロジェクトのダウンロード
Webアプリケーションの時と同様に、予め用意されたバッチのブランクプロジェクトをダウンロードします。

ダウンロードは[こちら](https://nablarch.github.io/docs/LATEST/doc/application_framework/application_framework/blank_project/setup_blankProject/setup_NablarchBatch.html)のドキュメントを参考に行います。

### Eclipseからテンプレートをダウンロードする
テンプレートはmvnからダウンロードします。
一般的にはコマンドプロンプトやターミナルからmvnのコマンドを実行するのですが、今回はEclipseからmvnを実行します。
※コマンドプロンプトやターミナルからmvnコマンドを実行するには事前にmvnのインストール（mvnのダウンロードとPathの設定）が必要です。

メニュー>実行>実行構成 をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/e81d58fc-025c-f4c3-2c31-fbc242f3f76b.png)

実行構成ダイアログにて、Mavenビルドを選択し、新規の起動構成ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/ec959548-2efb-ff3d-480f-07f9dae49f74.png)

名前に任意の値を入力し、規定ディレクトリーを「${workspace_loc}」、ゴールに以下の値を入力し、適用ボタン>実行ボタンの順でボタンをクリックします。
※archetypeVersion,groupId,artifactId,version,package名は変更可能です
```
org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -DinteractiveMode=false -DarchetypeGroupId=com.nablarch.archetype -DarchetypeArtifactId=nablarch-batch-archetype -DarchetypeVersion="5u21" -DgroupId=com.example -DartifactId=myapp-batch -Dversion=0.1.0 -Dpackage=com.example
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/2af8c84c-0adf-d2f4-9de9-302e47006b87.png)

コンソールビューで以下のようにBUILD SUCCESSが表示されれば成功です。
ワークスペース直下に、「myapp-batch」フォルダが作成されているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/67a38bda-e9e1-53e8-497e-847be3c32005.png)

## テンプレートプロジェクトの読み込み
メニュー>ファイル>ファイル・システムからプロジェクトを開く　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/e700078b-48bc-4346-338e-29a7a7fdb3f5.png)

ファイル・システムまたはアーカイブからプロジェクトをインポートダイアログでディレクトーボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/dcc886e5-f936-1a96-ec3c-88f39a09cb55.png)

[Eclipseからテンプレートをダウンロードする](##Eclipseからテンプレートをダウンロードする)にてダウンロードした「myapp-batch」を選択して、「フォルダーの選択」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/d525e9e6-c169-f60a-8123-87f484c3659a.png)

「myapp-batch」にチェックがついていることを確認して、完了ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/b4f6f0b9-8d8c-0654-27be-10d307441625.png)

プロジェクトが追加されました。

# テンプレートプロジェクトの動作確認を行う
## testの実施
テンプレートプロジェクトには既にテストコードが用意されており、「mvn　test」　コマンドにより単体テストが行えます。

プロジェクト名を右クリック>実行>Maven test　をクリックします。
※下図の通り、「clean」、「generate-sources」、「install」、「test」はデフォルトで用意されているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/3999bab5-873c-0496-be64-62527fee26f3.png)

初回だと、依存関係のあるjarのダウンロードに数分かかる場合があります。

BUILD SUCCESSとなれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/cf844131-dccc-e2c2-4b11-28942fac709a.png)

## パッケージの作成
mvn packageコマンドでパッケージ(jar)ファイルを作成します。

まずは実行構成を作成します。

プロジェクト名を右クリック>実行>実行の構成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/79f14f56-47cc-06b4-6ec3-e18582ead108.png)

実行構成ダイアログにて、Mavenビルドを選択し、新規の起動構成ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/ec959548-2efb-ff3d-480f-07f9dae49f74.png)

名前に任意の文字列を入力、基底ディレクトリーに「${project_loc:myapp-batch」、ゴールに「package」を入力し、適用ボタン>実行ボタンの順番でクリックします。
内部的に「mvn package」コマンドが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/244d0343-9de7-cebf-80ed-5acae1dbe140.png)

BUILD SUCCESSとなっていれば成功です。
プロジェクト・エクスプローラにてtargetフォルダ内にmyapp-batch-0.1.0.jarファイルが作成されているはずです。
表示されない場合はF5ボタンをクリックすると表示が更新されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/6fad6c22-1b17-83ba-a1fe-726b48b70fa9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/06269e38-4846-3e84-1bc1-135f0aac8afb.png)

## バッチ処理を実行してみる
今度は実際にバッチ処理を実行してみます。
コード内容は次回説明予定ですので、今回は成功することを確認します。

コマンドプロンプトから実行する場合は以下のコマンドで実行できます。
※mvnを事前にインストールする必要があります。

```
mvn exec:java -Dexec.mainClass=nablarch.fw.launcher.Main  \
    -Dexec.args="'-diConfig' 'classpath:batch-boot.xml' '-requestPath' 'SampleBatch' '-userId' 'batch_user'"
```

今回はEclipseより実行します。

前回同様、新規の起動構成を追加します。

|項目|値|例|
|---|---|---|
|名前|任意の値|mvn-exec-java|
|基底ディレクトリー|${project_loc:myapp-batch}|プロジェクト名は適時変更|
|ゴール|exec:java||
|exec.mainClass|nablarch.fw.launcher.Main||
|exec.args|'-diConfig' 'classpath:batch-boot.xml' '-requestPath' 'SampleBatch' '-userId' 'batch_user'||

※exec.mainClassとexec.argsは追加ボタンより登録します。

保存後、実行ボタンをクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/0879bd6e-2830-2296-e5b2-ac73cb833457.png)

成功すると、以下のようなログがコンソールに出力されます。

```
2022-03-13 11:31:36.689 -INFO- com.example.SampleBatch [202203131131366890002] boot_proc = [] proc_sys = [batch] req_id = [SampleBatch] usr_id = [batch_user] 疎通確認を開始します。
2022-03-13 11:31:36.766 -INFO- com.example.SampleBatch [202203131131366890002] boot_proc = [] proc_sys = [batch] req_id = [SampleBatch] usr_id = [batch_user] 取得したコード名称：ロック
2022-03-13 11:31:36.769 -INFO- com.example.SampleBatch [202203131131366890002] boot_proc = [] proc_sys = [batch] req_id = [SampleBatch] usr_id = [batch_user] 疎通確認が完了しました。
2022-03-13 11:31:36.775 -INFO- nablarch.fw.handler.MultiThreadExecutionHandler [202203131131366680001] boot_proc = [] proc_sys = [batch] req_id = [SampleBatch] usr_id = [batch_user] 
Thread Status: normal end.
Thread Result:[200 Success] The request has succeeded.
```


## バッチ処理を実行してみる②
今度は別のバッチリクエストを実行してみます。

前回同様、新規の起動構成を追加し、実行してみます。

|項目|値|例|
|---|---|---|
|名前|任意の値|mvn-exec-java2|
|基底ディレクトリー|${project_loc:myapp-batch}|プロジェクト名は適時変更|
|ゴール|exec:java||
|exec.mainClass|nablarch.fw.launcher.Main||
|exec.args|'-diConfig' 'classpath:resident-batch-boot.xml' '-requestPath' 'SampleResiBatch' '-userId' 'batch_user'||

コンソールから実行する場合は以下を実行します。
```
mvn exec:java -Dexec.mainClass=nablarch.fw.launcher.Main  \
    -Dexec.args="'-diConfig' 'classpath:resident-batch-boot.xml' '-requestPath' 'SampleResiBatch' '-userId' 'batch_user'"
```

成功すると、以下のようなログがコンソールに出力されます。
```
2022-03-13 11:34:59.023 -INFO- com.example.SampleResiBatch [202203131134590220002] boot_proc = [] proc_sys = [batch] req_id = [SampleResiBatch] usr_id = [batch_user] handleが呼ばれました。
2022-03-13 11:34:59.024 -INFO- com.example.SampleResiBatch [202203131134590220002] boot_proc = [] proc_sys = [batch] req_id = [SampleResiBatch] usr_id = [batch_user] USER_INFO_ID:00000000000000000001
2022-03-13 11:34:59.025 -INFO- com.example.SampleResiBatch [202203131134590220002] boot_proc = [] proc_sys = [batch] req_id = [SampleResiBatch] usr_id = [batch_user] LOGIN_ID:TAROU
2022-03-13 11:34:59.027 -INFO- com.example.SampleResiBatch [202203131134590220002] boot_proc = [] proc_sys = [batch] req_id = [SampleResiBatch] usr_id = [batch_user] KANA_NAME:たろう
2022-03-13 11:34:59.029 -INFO- com.example.SampleResiBatch [202203131134590220002] boot_proc = [] proc_sys = [batch] req_id = [SampleResiBatch] usr_id = [batch_user] KANJI_NAME:太郎
```

# その他の方法でバッチを実行する
これまではmvnコマンドでバッチの実行を行ってきましたが、それ以外の方法で実行する方法を見つけたので一緒に紹介しておきます。
実行時のパラメータを確認した限りでは、こちらの方がより実際の実行に近いのかなと思います（が今はそこまで深く考えなくても良い気がしています）。

## 実行の前の準備
プロジェクトフォルダ/h2/dbフォルダに存在する以下の2ファイルを削除します
* SAMPLE.h2.db
* SAMPLE.lock.db

次に、SAMPLE.h2.db.orgを同じフォルダにコピーして、ファイル名をSAMPLE.h2.dbに変更します。

これらのファイル操作で何をしたかといいますと、
SAMPLE.h2.dbがデータベースの実体なのですが、一度今回のバッチを実行すると、値が更新されてしまうためそのままだと期待通りの結果が得られなくなります。
そのため、orgの状態にSAMPLE.h2.dbを戻し、データベースの状態を元の状態に戻しました。

実行構成のダイアログにて、Mavenビルドではなく、「Javaアプリケーション」を選択して、新規の起動構成のボタンをクリックします。
メインタブにて、以下の項目を入力
|項目|値|例|
|---|---|---|
|名前|任意の値|run-app-batch|
|プロジェクト名|myapp-batch||
|メイン・クラス|nablarch.fw.launcher.Main||

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/de4ccf63-d472-3691-e844-cd1c6c18f2c2.png)

引数タブにて、以下の項目を入力
|項目|値|
|---|---|
|プログラムの引数|-diConfig classpath:resident-batch-boot.xml -requestPath SampleResiBatch -userId batch_user|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/a0f4780a-84f2-7771-1c5f-e8e42c85fb62.png)

成功すると、以下のようなログがコンソールに出力されます。
```
2022-03-13 11:34:59.023 -INFO- com.example.SampleResiBatch [202203131134590220002] boot_proc = [] proc_sys = [batch] req_id = [SampleResiBatch] usr_id = [batch_user] handleが呼ばれました。
2022-03-13 11:34:59.024 -INFO- com.example.SampleResiBatch [202203131134590220002] boot_proc = [] proc_sys = [batch] req_id = [SampleResiBatch] usr_id = [batch_user] USER_INFO_ID:00000000000000000001
2022-03-13 11:34:59.025 -INFO- com.example.SampleResiBatch [202203131134590220002] boot_proc = [] proc_sys = [batch] req_id = [SampleResiBatch] usr_id = [batch_user] LOGIN_ID:TAROU
2022-03-13 11:34:59.027 -INFO- com.example.SampleResiBatch [202203131134590220002] boot_proc = [] proc_sys = [batch] req_id = [SampleResiBatch] usr_id = [batch_user] KANA_NAME:たろう
2022-03-13 11:34:59.029 -INFO- com.example.SampleResiBatch [202203131134590220002] boot_proc = [] proc_sys = [batch] req_id = [SampleResiBatch] usr_id = [batch_user] KANJI_NAME:太郎
```

# 最後に
Nablarchのバッチアプリケーションのテンプレートをダウンロードし、Eclipseから実行を行い動作確認を行いました。
今回は言われるままに操作をしただけで、バッチの中身についてはわからなかったと思いますが、
次回、テンプレートの中身を確認しながらバッチアプリケーションの動作について整理したいと思います。