【IRIS/Cache】終了時に処理を実行する(%ZSTOP)

今回は、終了時に実行される「%ZSTOP」について解説していこうと思います。
また、%ZSTART/%ZSTOP両方に関連する内容や、ブログ作成時に利用している内容も触れたいと思います。

※この記事は下記の方向けになります。
  • インスタンス終了時に何かしらの処理を行いたい方
  • ターミナル等々の終了時に、何かしらの処理を行いたい方

はじめに

前回は「%ZSTART」について触れたので、今回は対となる「%ZSTOP」の解説となります。

とは言え、大体は「%ZSTART」の内容とほぼ同じで、開始時なのか終了時なのかの差でしかありません。

※%ZSTARTについては下記を参照してください。

本記事は、「%ZSTOP」について軽く触れたのち、共通の仕様やこのブログで使用している方法について触れていきたいと思います。

それではさっそく、%ZSTOPについて詳しくみていきましょう。

%ZSTOPとは

%SYSネームスペースに「%ZSTOP」ルーチンと、「SYSTEM」「LOGIN」「JOB」「CALLIN」サブルーチンを定義する事で、各処理の終了時時に上記サブルーチンが呼びされます。

また、端末の故障や電源がOFFになるような想定外のシステム終了時(停止)は、「%ZSTOP」が動作しないので注意が必用です。

ベース作成

%SYSネームスペースに%ZSTOPルーチンを作成したら、下記を貼り付けます。

%ZSTOP
	q
	;-
	;
SYSTEM ;
	q
	;-
	;
LOGIN ;
	q
	;-
	;
JOB ;
	q
	;-
	;
CALLIN ;
	q
	;-
	;

後は、必用なサブルーチンに終了処理を記述していくだけです。
動作の確認に関しては、%STARTで触れたので割愛したいと思います。

%ZSTART, %ZSTOP共通仕様について

%ZSTART, %ZSTOPについて、共通仕様を解説していきたいと思います。

有効/無効の切り替え

各サブルーチンの有効/無効の制御は、管理ポータルの「開始設定ページ」より設定可能です。

[システム管理] > [構成] > [追加の設定] > [開始]

開始設定画面の下記項目が、%ZSTART, %ZSTOPの各サブルーチンに該当しています。

設定項目ルーチン名サブルーチン名
SystemStart%ZSTARTSYSTEM
SystemHalt%ZSTOPSYSTEM
ProcessStart%ZSTARTLOGIN
ProcessHalt%ZSTOPLOGIN
JobStart%ZSTARTJOB
JobHalt%ZSTOPJOB
CallinStart%ZSTARTCALLIN
CallinHalt%ZSTOPCALLIN

「値」を「」に変更すると、該当のサブルーチンは無効となります。

各項目の編集画面をクリックし、チェックボックスのOn/Offで設定します。
 ※チェックボックスOn = 真

一時的、恒久的に機能を無効にしたい場合は、こちらで設定を行ってください。

各ルーチンの削除

%ZSTART, %ZSTOPルーチンを削除する際は、上記設定を「偽」に変更してから削除した方が良いです。
削除中に、各サブルーチンが実行されるのを防ぎ、事故を回避する事が可能です。

ブログの検証で使用している%ZSTARTの利用方法

一部の業務では、開始時にプロセスをjob実行していたりしますが、そこまで%ZSTARTや%ZSTOPを多用している訳ではありません。

ただ、速度検証を行う際は別で、%ZSTARTの機能を利用しています。
利用目的は、グローバル・キャッシュの削除です。

と言うのも、同じ処理を何度も実行すると、グローバル・キャッシュが効いて処理速度が変わってきてしまいます。
ただ、グローバル・キャッシュは削除する方法なく、IRISの再起動以外に手はありません。
 →OSの再起動もあった方が良いらしいですが、そこまでは行っていません。

そこでIRISを再起動させ、起動時に%ZSTARTから検証関数を実行する方法を行っています。

【%ZSTARTを含めた検証環境の構成】

%ZSTART.macの処理

%ZSTART
	q
	;-
	;
SYSTEM ;
	try {
		s stopFile = "D:\IRISDB\SAMPLE\Stop.txt"
		, nxNsNm = "SAMPLE"
		i (##class(%SYS.Namespace).Exists(nxNsNm)){
			zn nxNsNm
			
			s cnt = $g(^Count,0) // 10回実行して検証終了
			, flg = ##class(%File).Exists(stopFile) // ファイルがあったら処理中止
			i (cnt<10)&&('flg) {
				d ##class(developer.Sample).continueDo()
				
				// 再起動
				d $zf(-100,"/ASYNC","D:\Temp\bat\stopStartIRIS.bat")
			}
		}
	}catch e {
		s ^Error.log("error", $i(^Error.log("error")))=$system.Status.GetErrorText(e.AsStatus())
	}
	q
	;-
	;

検証用のクラス

Class developer.Sample
{
/// ロギング用関数
ClassMethod makeLog(txt As %String, fileName As %String = "D:\IRISDB\SAMPLE\Blog.log")
{
	open fileName:("WAK\UTF8\"):5
	use fileName
	w txt
	close fileName
}

/// 検証用のラップ関数
ClassMethod continueDo()
{
	s cnt = $g(^Count,0) + 1
	d ..makeLog($c(13,10)_cnt_"回目Start "_$zdt($h,3,1))
	
	// 検証したい処理を記述

	d ..makeLog($c(13,10)_cnt_"回目End  "_$zdt($h,3,1))
	d $i(^Count)
}
}

停止用のbatについては下記記事を参照してください。
 ※起動用のbatは「stop → start」に変更するだけです

おわりに

いかがだったでしょうか。

検証用で使用している%ZSTARTの構成は、インターシステムズの方々が見たら卒倒しそうな運用方法ですが、私は割と気に入って使っています。

ご紹介した方法以外で他にいい検証方法があれば、是非ご連絡いただけると幸いです。

最後までお読みいただき、ありがとうございました。
この記事が皆様のお役に立てたなら幸いです。

今後も役に立ちそうな情報を発信していきますので、ぜひご期待ください。