一歩上の使い方 ~自動再起動編~

OrangeLab. 運営チーム
作成日時: - 更新日時:
Avatar
当記事は、コミュニティ掲載記事執筆者募集よりご寄稿いただいた記事となります。
HULFT ScriptにおけるOutOfMemoryError発生時の再起動方法という、技術者必見のTipsをご紹介いただきます。

はじめに

皆様、はじめまして。
株式会社メディアフォース 技術ソリューショングループの齊藤と申します。

HULFT OrangeLab.読者の皆様は日頃からHULFTをご愛用いただいているかと思いますが、HULFT ScriptというHULFT Series製品をご存知でしょうか。
HULFT Scriptとは、HULFT8より追加されたオプション機能となり、バッチやシェルスクリプトで行っている配信の前ジョブ・後ジョブなどをGUIベースで簡単に作成できる機能です。

詳しくは以下をご参照ください。
https://www.hulft.com/software/hulft-script

本Tipsでは、HULFT Scriptをご利用の皆様に、ひとつ上を行く使い方をお見せしていきます。
※本TipsではHULFT8 Script Option for Windowsを使用してご紹介します。

HULFT Scriptテンプレートについて

HULFT Scriptの概要はなんとなく分かったけど、実際にどう使えばいいのかよく分からない方もいらっしゃるかと思います。
そこで、HULFT Scriptにはいくつかの「よくある処理」をテンプレートとして同梱しています。
テンプレートを使うことで、使い方や作り方も把握できるようになっています。

テンプレートについては以下をご参照ください。
https://www.hulft.com/software/hulft-script/function

OutOfMemoryErrorについて

Javaアプリケーションを作るうえで避けては通れないのが、OutOfMemoryErrorです。
HULFT ScriptもJavaアプリケーションですから、 OutOfMemoryErrorは必ず考慮しなければなりません。

Javaはあらかじめ利用するメモリ量を設定で決めておきます。通常であれば使用するメモリ量を予測して超えないように設定しますが、データ量が予想以上であった場合などOutOfMemoryErrorは容易に起こり得ます。

また、OutOfMemoryErrorとはException(例外)ではなくErrorです。Errorは発生してはならない異常事態です。Errorが発生したということはJVM内部の状態が不安定です。処理中であったとしても、その処理は正しいデータを出力する保証はなく、一刻も早く停止すべき状態となります。

今回は、OutOfMemoryError発生時に一刻も早くHULFT Script Serverを再起動するためのTipsをご紹介します。

なお、HULFT Scriptは原則として、動作確認をしていないオプションはサポート対象外となります。開発環境など影響の少ない環境で十分に動作確認のうえご利用ください。

設定手順

まず、再起動を行うバッチを作成します。
その後、OutOfMemoryError発生時にバッチを実行するようにHULFT Script Serverの設定を行います。

再起動用バッチを作成する

再起動を行うためのバッチを作成します。たとえば、次のようなバッチファイルです。

> TASKKILL /IM HULFTScriptServer.exe /T /F
> cmd /c start HULFTScriptServer.exe
> exit

TASKKILLコマンドで「HULFTScriptServer.exe」のプロセスをkillします。
その後、HULFTScriptServer.exeを実行します。
OutOfMemoryError発生時には、HULFTScript Serverの状態は不安定となり、終了コマンドを受け付けられないケースも考えられます。
そのため、Shutdown.exeではなく、TASKKILLコマンドを使います。

Windowsサービスに登録している場合は次のようなバッチファイルでも良いでしょう。

> net stop " HULFTScriptServer "
> net start " HULFTScriptServer "

バッチファイル単体で再起動が行えることを確認します。
コマンドによっては管理者権限が必要な場合もありますので、権限には注意してください。

作成したバッチファイルは $HULFTSCRIPT_HOME/server/bin に配置しておきます。
名前はなんでも良いですが、今回は reboot.bat とします。

OnOutOfMemoryErrorオプションを使う

JVMのオプションである -XX:OnOutOfMemoryError を利用します。
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

-XX:OnOutOfMemoryErrorオプションはOutOfMemoryError発生時に指定したコマンドを実行するオプションです。
これに再起動コマンドを設定しておくことでOutOfMemoryError発生時に再起動が可能です。

-XX:OnOutOfMemoryError を設定する。

HULFTScriptでは、$HULFTSCRIPT_HOME/server/bin/HULFTScriptServer.lax の lax.nl.java.option.additional にJVM引数を設定できます。
lax.nl.java.option.additional に次の引数を追加します。



> -XX:OnOutOfMemoryError="cmd /c start reboot.bat"

単にreboot.batで良いではないかと思うのですが、taskkillコマンドで自分自身をkillすることはできないため、startコマンドでjava.exeとreboot.batのプロセスを分けてからkillします。
サービスの再起動コマンドならreboot.batのみでいける可能性もあります。

動作確認する

  1. HULFTScriptServerのヒープを128MB程度にして、OutOfMemoryErrorが発生しやすい状況を作ります。





  2. HULFTScriptServerとStudioを起動して、サイズの大きいファイルを読み取るスクリプトを作成します。







  3. スクリプトを通常実行で実行します。

  4. ファイルサイズが大きければ実行中にOutOfMemoryErrorが発生します。そのタイミングで設定したバッチファイルが実行され、HULFT Script Serverが再起動されれば設定成功です。





    HULFT Script Serverのヒープサイズを設定するには、$HULFTSCRIPT_HOME/server/binのHULFTScritpServer.laxを設定します。詳細はHULFT Scriptのヘルプを参照してください。

さいごに

本番運用時にはプロセス監視ツールなど導入しているケースも多いですが、開発環境まで監視ツールを導入するケースは少ないかと思います。
また、本番運用時でも再起動は監視ツール等に任せますが、OutOfMemoryErrorが発生したことを通知したいケースは多くあります。
Linuxであれば wget や mail コマンドなどでHTTPサーバにプッシュする、メールを送信するなど通常の監視にプラスすることで更に監視が便利になりそうです。
この記事は役に立ちましたか?
1人中1人がこの記事が役に立ったと言っています

コメント