【HULFT Square 】ファイルの先入れ先出し（FIFO）をやってみた。

## はじめに

本記事では "ゆる～く" HULFT Squareのご紹介をします。
HULFT Squareについてはこちらの[公式HP](https://www.hulft.com/service/hulft-square)、[公式マニュアル](https://www.hulft.com/help/ja-jp/HULFTSquare/homeindex.htm)へ。

:::note warn
以下内容はご参考となりますので、実際にご検証、マニュアルのご参照をお願い致します。
:::
:::note warn
また弊社サポートへお問い合わせいただいても
お答えできない場合がございます🙇
是非コメント欄でご意見いただけますと幸いです。
:::

## 今回の内容
受発注業務でよくある。。。先入れ先出し。。。FIFOをHULFT Square単体で
やってみます。

:::note info
【先入れ先出し（FIFO）に使用する時刻】
HULFT Squareストレージに格納されているファイルの最終更新日時を用いて、
ファイルの順序制御を行います。
S3に保存された日時を使う方法も実装できると思っていますが、
今回は見逃してください。
:::

<font>$\huge{↓やることイメージ↓}$</font>

S3に保存されているデータを取得し、HULFT Squareストレージ内で更新日時を比較します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/e544484a-b651-a372-1881-db90e7b6f6e8.png)

HULFT Squareのフォルダ構成は以下の様に設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/0a973298-297a-4c5b-d37e-7e63cd9bc7ab.png)

:::note warn
連携の流れ
①S3コネクタにてHULFT Squareストレージの"受信用フォルダ"へダウンロード。
②HULFT Squareストレージの"処理用フォルダ"内にファイルが存在しないことを
　条件に "受信用フォルダ" 内にて、更新日時が最も古いファイルを
　"処理用フォルダ" へ移動。
③"処理用フォルダ"へファイル作成を契機にデータ変換処理を行い、
　処理完了時にファイルを "退避用フォルダ" へ移動。
:::

先入れ先出し（FIFO）のフローはこんな感じ。
スクリプト（処理）を3つ作成し以下の様にファイルを遷移させます。
スクリプト毎に起動方法（ジョブ）が異なるのもポイントです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/c095f257-2a05-c388-216c-9380877d1e5a.png)

:::note info
HULFT Squareのジョブについて
スクリプト（処理）を何を契機に起動するか指定できます。
詳細はこちらの公式[マニュアル](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/HULFT_Square/HS_Jobs/square_Jobs.htm)をどうぞ～
:::

次にスクリプトA～Cの内容を説明します。

## スクリプトA処理内容
スクリプト名　　　　　：01_ファイル取得
スクリプトの目的　　　：S3から "受信用フォルダ" へダウンロード
ジョブ（起動する契機）：スケジュールジョブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/d6124cfe-192a-6ab6-f356-418b397194c9.png)

これはS3からダウンロードしてくるだけ。
今回は正常系のみの作成です。

## スクリプトB処理内容
スクリプト名　　　　　：02_ファイル移動
スクリプトの目的　　　：ファイル毎の更新日時比較 + "処理用フォルダ" へファイル移動
ジョブ（起動する契機）：スケジュールジョブ
![スクリプトB_全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/e721eaae-98c8-3b22-703f-f77aafa0cc96.png)



このスクリプトは処理が多いですね。。
少し長くなりそうなので、処理毎にざっくり説明します。
見ただけでおおよそわかる方は次のスクリプトへどうぞ。。

① 02_Tran存在確認（[ファイルシステム読み取り](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Designer/Connector/filesystem_get_data.htm)）
　"処理用フォルダ"（02_Tran）に**ファイルが存在していないこと**を確認しています。
　if(条件分岐)の条件に設定します。

② list取得（[ファイル名一覧取得](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Designer/Connector/file_list_file.htm)）
　"受信用フォルダ"（01_RCV）に**ファイルが存在していること**を確認しています。

:::note info
①と②でアイコンが異なる理由
この処理の負荷テストを行った際に気づいたことなのですが、
①で使用している「ファイルシステム読み取り」はファイルパスも取得しているからか、指定したフォルダにファイル数が多い場合はパフォーマンスが落ちました。
今回の処理では、「指定フォルダのファイル数」、「ファイルの更新日時」が取得できれば良いのでファイル名一覧取得にしました。

ちなみに①の処理が「ファイルシステム読み取り」なのは怠慢です、、
:::

③ if（[条件分岐](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Designer/Connector/flow_conditional_branch.htm)）
　①で指定した "処理用フォルダ" にファイルが存在しないこと、②で指定した
　"受信用フォルダ" にファイルが存在していることを条件にしています。

こんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/96dfaf4a-edcd-adfb-811b-3f643d875e94.png)

④ foreach([繰り返し(データ件数)処理](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Designer/Connector/flow_loop_by_number_of_data.htm))
　②から黄色の線（データフロー）が引いてある通り、"受信用フォルダ"にて
　取得したファイル数分ループ処理を行います。
　ループする処理は⑤のmappingになります。

⑤ mapping(1)（[mapping](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Designer/Mapper/mapper.htm)）
　こんな処理をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/11ed94a7-9d6a-cb63-6c4d-e48e27600fdf.png)
　条件の[以前ロジック](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Designer/Mapper/IsBefore.htm)と、[分岐のスイッチ判定](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Designer/Mapper/Switch.htm)を使用して更新日時の比較を行っています。
 
　ループ処理の中に配置していますので
　1ループ目はそのままスクリプト変数に値が格納され
　・　
　・　
　・　　
　2ループ目は
　2ファイル目のファイル更新日時と1ファイル目のファイル更新日時の比較をし、
　2ファイル目の更新日時が1ファイル目の更新日時以前であれば2ファイル目の
　ファイル名を「Move_Filename」へ出力。
　以後であれば1ファイル目のファイル名を「Move_Filename」へ出力。
　・
　・
　・
　3ループ目は
　3ファイル目のファイル更新日時と2ファイル目のファイル更新日時の比較をし、
　3ファイル目の更新日時が2ファイル目の更新日時以前であれば3ファイル目の
　ファイル名を「Move_Filename」へ出力
　以後であれば「Move_Filename」に格納されているファイル名を「Move_Filename」へ
　出力。
　・
　・
　・

といった感じです。

⑥ 移動([移動処理](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Designer/Connector/file_move_file.htm))
　⑤のループ処理にて一番古いファイルを "受信用フォルダ" から "処理用フォルダ"へ
　移行しています。
　移行元のファイルを指定する際には「Move_Filename」スクリプト変数を
　使用しています。

⑦ S3_BKUP移動([ファイル/フォルダコピー処理](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Designer/Connector/amazons3_copy.htm))
　スクリプトAではS3に対してポーリングを行いダウンロード処理をしています。
　スクリプトAの処理パフォーマンス向上の為に、ダウンロードを行っているフォルダから
　バックアップ用のフォルダへコピーする処理です。
　⑧でこのファイルを削除します。

⑧ S3_移動ファイル削除([ファイル/フォルダ削除処理](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/Designer/Connector/amazons3_delete.htm))
　⑦にて移動したファイルを移動元（S3の受信用フォルダ）から削除する処理です。
 

## スクリプトC処理内容
スクリプト名　　　　　：03_変換処理_ファイル移動
スクリプトの目的　　　：変換処理 + 処理済ファイルを "処理用" ➡ "退避用フォルダ" へ
　　　　　　　　　　　　ファイル移動
ジョブ（起動する契機）：ファイルイベントジョブ
![スクリプトC_全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/1268c46f-5fd6-484b-6902-20e983aa148c.png)

この処理は "処理用フォルダ" にファイルが作成されたタイミングで処理が起動するように
「ファイルイベントジョブ」を設定しています。
ですので "処理用フォルダ" へのlist取得（ファイル名一覧取得処理）から始まります。
"処理用フォルダ" にはファイルが1つだけ存在する状態ですので、list取得したファイル名を
変数代入（mapping）にてスクリプト変数に格納します。

青枠の部分は変換処理ですのでお好きに作って下さい！今回はCSVtoDBとしました。
最後に処理したファイルを "処理用フォルダ" から "退避用フォルダ" へ移行して
<br>
終わり！！！

## さいごに
今回はHULFT Squareだけで簡易的に先入れ先出し(FIFO)を行いました。
S3に格納されるのだから、SQS使えばいいじゃん！その通りですね。
限定的な使いかたかもしれませんが、
こんなこともできます～！というご紹介と思って頂ければ幸いです。

動いている動画は~~ちょっと大変そう~~追記できればと思います。

以上！