3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-04-16

はじめに

本記事では "ゆる~く" HULFT Squareのご紹介をします。
HULFT Squareについてはこちらの公式HP公式マニュアルへ。
以下内容はご参考となりますので、実際にご検証、マニュアルのご参照をお願い致します。

今回の内容

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

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

$\huge{↓やることイメージ↓}$

S3に保存されているデータを取得し、HULFT Squareストレージ内で更新日時を比較します。
image.png

HULFT Squareのフォルダ構成は以下の様に設定しています。
image.png

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

先入れ先出し(FIFO)のフローはこんな感じ。
スクリプト(処理)を3つ作成し以下の様にファイルを遷移させます。
スクリプト毎に起動方法(ジョブ)が異なるのもポイントです。
image.png

HULFT Squareのジョブについて
スクリプト(処理)を何を契機に起動するか指定できます。
詳細はこちらの公式マニュアルをどうぞ~

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

スクリプトA処理内容

スクリプト名     :01_ファイル取得
スクリプトの目的   :S3から "受信用フォルダ" へダウンロード
ジョブ(起動する契機):スケジュールジョブ
image.png

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

スクリプトB処理内容

スクリプト名     :02_ファイル移動
スクリプトの目的   :ファイル毎の更新日時比較 + "処理用フォルダ" へファイル移動
ジョブ(起動する契機):スケジュールジョブ
スクリプトB_全体.png

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

① 02_Tran存在確認(ファイルシステム読み取り
 "処理用フォルダ"(02_Tran)にファイルが存在していないことを確認しています。
 if(条件分岐)の条件に設定します。

② list取得(ファイル名一覧取得
 "受信用フォルダ"(01_RCV)にファイルが存在していることを確認しています。

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

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

③ if(条件分岐
 ①で指定した "処理用フォルダ" にファイルが存在しないこと、②で指定した
 "受信用フォルダ" にファイルが存在していることを条件にしています。

こんな感じ↓
image.png

④ foreach(繰り返し(データ件数)処理)
 ②から黄色の線(データフロー)が引いてある通り、"受信用フォルダ"にて
 取得したファイル数分ループ処理を行います。
 ループする処理は⑤のmappingになります。

⑤ mapping(1)(mapping
 こんな処理をしています。
image.png
 条件の以前ロジックと、分岐のスイッチ判定を使用して更新日時の比較を行っています。

 ループ処理の中に配置していますので
 1ループ目はそのままスクリプト変数に値が格納され
 ・ 
 ・ 
 ・  
 2ループ目は
 2ファイル目のファイル更新日時と1ファイル目のファイル更新日時の比較をし、
 2ファイル目の更新日時が1ファイル目の更新日時以前であれば2ファイル目の
 ファイル名を「Move_Filename」へ出力。
 以後であれば1ファイル目のファイル名を「Move_Filename」へ出力。
 ・
 ・
 ・
 3ループ目は
 3ファイル目のファイル更新日時と2ファイル目のファイル更新日時の比較をし、
 3ファイル目の更新日時が2ファイル目の更新日時以前であれば3ファイル目の
 ファイル名を「Move_Filename」へ出力
 以後であれば「Move_Filename」に格納されているファイル名を「Move_Filename」へ
 出力。
 ・
 ・
 ・

といった感じです。

⑥ 移動(移動処理)
 ⑤のループ処理にて一番古いファイルを "受信用フォルダ" から "処理用フォルダ"へ
 移行しています。
 移行元のファイルを指定する際には「Move_Filename」スクリプト変数を
 使用しています。

⑦ S3_BKUP移動(ファイル/フォルダコピー処理)
 スクリプトAではS3に対してポーリングを行いダウンロード処理をしています。
 スクリプトAの処理パフォーマンス向上の為に、ダウンロードを行っているフォルダから
 バックアップ用のフォルダへコピーする処理です。
 ⑧でこのファイルを削除します。

⑧ S3_移動ファイル削除(ファイル/フォルダ削除処理)
 ⑦にて移動したファイルを移動元(S3の受信用フォルダ)から削除する処理です。

スクリプトC処理内容

スクリプト名     :03_変換処理_ファイル移動
スクリプトの目的   :変換処理 + 処理済ファイルを "処理用" ➡ "退避用フォルダ" へ
            ファイル移動
ジョブ(起動する契機):ファイルイベントジョブ
スクリプトC_全体.png

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

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


終わり!!!

さいごに

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

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

以上!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?