HULFT 動的ファイル配信

下図の仕様を満たすような設定とスクリプトを作成しました。
途中で全部SFTP環境でやれそうな気がしてましたのでそのため、特定のフォルダにファイルがおかれた場合というファイルトリガ機能を追加しました。

仕様
配信サーバ(wHULFT)のc:\tmp\tmp3フォルダにcsvファイルが保存されたら集信サーバ(wHULFT02)にcsvファイルを配信する。複数のファイルがある場合のは最新のcsvファイルのみ配信対象とする

結論としてHULFTのインターフェイスのみで上記の仕様を満たすのは不可能みたいです。
HULFTをファイル監・ファイル転送インフラとして、スクリプトを記載することがメインになります。
wHULFTのホスト名から推定されたかもしれませんが、OSはWindows 2022を使用しています。また、名前解決する必要があります(DNSまたはhosts)


配信サーバ(wHULFT)の設定手順

HULFTのメニュー画面
メニュー「転送グループ情報」より、転送グループを作成します。localの転送グループIDでwHULFT02を登録します(集信サーバも一緒です)
メニュー「ジョブ起動情報」よりジョブを作成します。JOB01のジョブIDで起動ジョブにはc:\tmp\FILETRG01.batと記載します(要はファイルが監視フォルダに保存されるとFILETRG01.batが実行されます)
ジョブ保存後の画面です
メニュー「ファイルトリガ情報」より新規にファイルトリガ情報を作成します。トリガIDにTRG1、ディレクトリ名(にc:\tmp\tmp3ここが監査対象のフォルダ)をファイル名に*.csv(csvファイルならなんでも発動)をジョブIDにJOB01を記載(他はデフォルトのままです)
ファイルトリガ作成後の画面です
以下、FILETRG01.batの中身です。コピー&ペーストでFILETRG01.batのファイル名でc:\tmpに保存してください(Windowsバッチファイル)。

@echo off
setlocal enabledelayedexpansion

REM === 1. 監視対象フォルダ ===
set "TARGET_DIR=C:\tmp\tmp3"

REM === 2. HULFT配信管理名 ===
set "JOB_NAME=FILETRG"

REM === 3. 最新ファイルの存在チェック ===
if not exist "%TARGET_DIR%\*" (
echo [%date% %time%] [ERROR] %TARGET_DIR% にファイルがありません
exit /b 1
)

REM === 4. 最新ファイル名(1件のみ)を取得 ===
for /f "delims=" %%i in ('dir /b /a-d /o-d "%TARGET_DIR%\*"') do (
set "LATEST_NAME=%%i"
rem 1件目で終了
goto :after_found
)

:after_found
echo [%date% %time%] [INFO] 送信ファイル名: %LATEST_NAME%

REM === 5. HULFT ジョブ実行 ===
set "SEND_FILE=%LATEST_NAME%"
pushd "C:\HULFT Family\hulft10\bin"

echo [%date% %time%] [INFO] utlsend 実行中...
utlsend -f "!JOB_NAME!" -msg0 "!SEND_FILE!"
set "ERRCODE=%ERRORLEVEL%"

popd

REM === 6. 実行結果チェック ===
if %ERRCODE% neq 0 (
echo [%date% %time%] [ERROR] utlsend 実行に失敗しました (コード=%ERRCODE%)
exit /b %ERRCODE%
) else (
echo [%date% %time%] [INFO] utlsend 実行成功
)

endlocal
exit /b 0
RHELでのバッシュはこちら

#!/bin/bash

# === 設定 ===
TARGET_DIR="/tmp/tmp3" # 監視対象フォルダ
JOB_NAME="FILETRG" # HULFT配信管理名
HULFT_BIN="/usr/local/HULFT/bin" # HULFT実行ディレクトリ
LOG_FILE="/var/log/hulft_send.log" # ログ出力先

# === 関数: ログ出力 ===
log() {
local level="$1"
local msg="$2"
local timestamp
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] [$level] $msg" | tee -a "$LOG_FILE"
}

# === 1. 監視対象フォルダの存在チェック ===
if [ ! -d "$TARGET_DIR" ]; then
log "ERROR" "$TARGET_DIR が存在しません"
exit 1
fi

# === 2. 最新ファイルの存在チェック ===
if [ ! "$(ls -A "$TARGET_DIR" 2>/dev/null)" ]; then
log "ERROR" "$TARGET_DIR にファイルがありません"
exit 1
fi

# === 3. 最新ファイル名(1件のみ)を取得 ===
LATEST_NAME=$(ls -t "$TARGET_DIR" | head -n 1)
log "INFO" "送信ファイル名: $LATEST_NAME"

# === 4. HULFT ジョブ実行 ===
SEND_FILE="$LATEST_NAME"

if [ ! -x "$HULFT_BIN/utlsend" ]; then
log "ERROR" "utlsend コマンドが見つかりません: $HULFT_BIN/utlsend"
exit 1
fi

cd "$HULFT_BIN" || {
log "ERROR" "HULFT実行ディレクトリに移動できません ($HULFT_BIN)"
exit 1
}

log "INFO" "utlsend 実行中..."
./utlsend -f "$JOB_NAME" -msg0 "$SEND_FILE"
ERRCODE=$?

# === 5. 実行結果チェック ===
if [ $ERRCODE -ne 0 ]; then
log "ERROR" "utlsend 実行に失敗しました (コード=$ERRCODE)"
exit $ERRCODE
else
log "INFO" "utlsend 実行成功"
fi

exit 0
メニュー「配信管理情報」より新規配信情報を作成します。ファイルIDはFILETRG(スプリクト内にこの名前で記載されているので注意)ファイル名はC:\tmp\temp3\$MSG0と入力します($MSG0がファイル名そのままという変数になります)

サービスの再起動
ファイルトリガを新規作成・変更・削除した場合HULFTサービスの再起動が必要になりますので。ローカルサービス(HULFT)をここで再起動します。

配信側は以上です。


集信サーバ(wHULFT02)の設定手順

メニュー「転送グループ情報」より、転送グループを作成します。localの転送グループIDでwHULFT02を登録します(配信サーバも一緒です)
メニュー「集信管理情報」より新規配信情報を作成します。ファイルIDはFILETRG、ファイル名はC:\tmp\temp3\$SNDFILEと入力します($SNDFILEが配信されてきたファイル名そのまま受信という変数になります)

テスト
配信サーバのc:\tmp\tmp3にcsvファイルを置くと集信サーバのc:\tmp\tmp3に同じcsvファイルが転送されます。

ご参考まで

関連記事

TOP