自動化インプリメンテーション
A および B という 2 つの MVS™ システムがあるとします。これらのシステムで DASD は共用されません。システム A で作成された障害項目は、Fault Analyzer ISPF インターフェースを使用して表示/再分析のためにシステム B に自動的にコピーできます。
その項目はシステム A 上の通知ユーザー出口を使用してコピーされます。システム A では TSO バッチ・ジョブが実行され、障害項目がシステム B 上の専用ユーザー ID に PDS メンバーとして送信されます。システム B では、連続して実行されるバッチ TSO ジョブが障害項目を受信してステージング・データ・セットに入れます。次に IDIUTIL バッチ・ユーティリティーが呼び出されて、障害項目がローカル・ヒストリー・ファイルにインポートされます。

ユーザー出口全般については、ユーザー出口を使用した Fault Analyzer のカスタマイズを参照してください。具体的な通知ユーザー出口については、通知ユーザー出口を参照してください。IDIUTIL バッチ・ユーティリティーについては、ヒストリー・ファイルの管理 (IDIUTIL ユーティリティー)を参照してください。
NFYEXIT: サンプル通知ユーザー出口
nodeid = 'MVSB' /* <--- verify/change */ ❶
userid = 'IDIROBOT' /* <--- verify/change */ ❷
jobcard = '//NOTIFY JOB MSGCLASS=Z' /* <--- verify/change */ ❸
/*********************************************************************/ ❹
/* #Optionally, add checks here for selective transmission of fault */
/* entries that only match a certain criteris. */
/* For example: */
/* If ENV.USER_ID ¬= "FRED" then exit 0 */
/* If ENV.USER_IDIHIST ¬= "MY.HISTFILE" the exit 0 */
/*********************************************************************/
"MAKEBUF"
queue jobcard
queue '//**************************************************************'
queue '//* Export fault entry'
queue '//**************************************************************'
queue "//EXPORT EXEC PGM=IDIUTIL"
queue "//DD1 DD DISP=(,PASS),"
queue "// SPACE=(CYL,(10,100,5),RLSE),"
queue "// DCB=(DSORG=PO,RECFM=VB,LRECL=10000)"
queue "//SYSPRINT DD SYSOUT=*"
queue "//SYSIN DD *"
queue " EXPORT("ENV.IDIHIST"("ENV.FAULT_ID"),DD1)"
queue "/*"
queue '//**************************************************************'
queue '//* Terse the export data set'
queue '//**************************************************************'
queue "//TERSE EXEC PGM=AMATERSE,PARM='PACK'"
queue "//SYSPRINT DD SYSOUT=*"
queue "//SYSUT1 DD DISP=SHR,DSN=*.EXPORT.DD1"
queue "//SYSUT2 DD DISP=(,PASS),"
queue "// SPACE=(CYL,(10,100),RLSE)"
queue "//SYSPRINT DD SYSOUT=*"
queue '//**************************************************************'
queue '//* Perform TSO XMIT of the exported and tersed fault entry'
queue '//**************************************************************'
queue "//XMIT EXEC PGM=IKJEFT01"
queue "//DD1 DD DISP=SHR,DSN=*.TERSE.SYSUT2"
queue "//SYSTSPRT DD SYSOUT=*"
queue "//SYSTSIN DD *"
q_rec(" XMIT" nodeid"."userid "DDNAME(DD1) -")
q_rec(" NONOTIFY")
queue '/*'
/* 'Submit' the stacked TSO batch job */
n = queued()
"IDIALLOC DD(DD1) SYSOUT PGM(INTRDR)"
if rc = 0 then do /* allocation worked so generate output */
address mvs "EXECIO" n "DISKW DD1 (FINIS"
"IDIFREE DD(DD1)"
say 'Fault entry' ENV.FAULT_ID 'sent to' nodeid'.'userid
end
else do
"IDIWTO Allocation of INTRDR failed"
say 'Fault entry' ENV.FAULT_ID 'job submission failure'
end
exit 0
/* Pad record with blanks to 80 bytes. */
q_rec: procedure
parse arg rec
if (length(rec) < 80) then rec = rec||copies(' ',80-length(rec))
queue rec
return 0
- ❶
- 「nodeid」は障害項目の送信先のターゲット・システムを指定します。
- ❷
- 「userid」は障害項目がターゲット・システムで受信されるユーザー ID を指定します。このユーザー ID は、障害項目の受信にのみ使用してください。
- ❸
- ジョブ・カードがローカル標準に準拠していることを確認します。
- ❹
- 障害が別のシステムへの送信対象として適格であるかどうかを確認するために、ここでチェックを追加できます。例では、ユーザー ID やヒストリー・ファイル名をどのように使用できるのかを示していますが、ENV データ域や NFY データ域にあるすべてのフィールドをチェックすることが可能です。
DataSets(IDIEXEC(exec.lib))
Exits(NOTIFY(REXX(NFYEXIT)))
IDIROBOT: 障害項目を受信するためのサンプル REXX EXEC
- IDIROBOT ユーザー用のファイルを受信し、ステージング・データ・セットに含めます。このデータ・セットから、IDIUTIL バッチ・ユーティリティーを使用してローカル・ヒストリー・ファイルにインポートされます。
- IDIUTIL IMPORT ユーザー出口、IDIROBEX を作成します (REXX IDIUTILユーザー出口の例を参照)。
histfile = 'B.HIST' /* <--- verify/change */ ❺
temphist = 'B.TEMP' /* <--- verify/change */ ❻
seconds = '60' /* <--- verify/change */ ❼
use_exit = 'Y' /* <--- Y|N. verify/change */ ❽
address tso
x = prompt('on')
x = outtrap('var.',10,'noconcat')
do forever
/* Obtain information about transmitted data on the JES output queue */
if queued() = 0 then queue 'end'
'receive'
input = 'N'
/* Examine the output from the 'dummy' receive command.
The following variables are initialized:
dsn - the 'sending' history file name
fromid - the user ID performing the TSO XMIT
node - the JES node from which the fault entry was sent
faultid - the fault ID (member name) */
do i = 1 to var.0
parse var var.i msgno t1 t2 t3 t4 t5 t6
if msgno = 'INMR901I' then do
dsn = t2
fromid = t4
node = t6
end
else if msgno = 'INMR902I' then do
faultid = t2
input = 'Y'
leave
end
end
/* Perform actual receive to the staging history file followed by an
IDIUTIL batch utility import if there is data available */
if input = 'Y' then do
if faultid <> "" then do
/* Receiving a PDS/E. */
say 'Receiving' dsn'('faultid') from' node'.'fromid
queue "DSN('"temphist"')"
queue 'END'
'RECEIVE'
end
else do
/* Receiving a sequential data set - assume AMATERSE PACKed. */
say 'Receiving' dsn 'from' node'.'fromid
queue "DSN('"temprecv"')"
queue 'END'
'RECEIVE'
/* Perform AMATERSE UNPACK. */
"ALLOC DD(SYSPRINT) DUMMY"
"ALLOC DD(SYSUT1) DA('"temprecv"') SHR"
"ALLOC DD(SYSUT2) DSN('"temphist"'),
NEW CATALOG UNIT(SYSALLDA) RECFM(V B) LRECL(10000),
CYLINDERS SPACE(10,100) DIR(5)"
address tso "CALL *(AMATERSE) 'UNPACK'"
say 'UNPACK rc =' RC
/* Get fault ID (member name). */
"LISTDS '"temphist"' MEMBERS"
/* Sample output: */
/* FRED.$$TEMP$$.HIST */
/* --RECFM-LRECL-BLKSIZE-DSORG */
/* VB 10000 27998 PO */
/* --VOLUMES-- */
/* E$US21 */
/* --MEMBERS-- */
/* F01103 */
mbr_start = 0
do i = 1 to var.0
/*say "var."i"='"var.i"'"*/
if mbr_start = 0 then do
if strip(var.i) = "--MEMBERS--" then do
mbr_start = i + 1
leave
end
end
end
if mbr_start = var.0 then do
/* One, and only one, member. */
faultid = strip(var.mbr_start)
end
else do
say 'ERROR: More than one member found in data set' temphist,
'- terminating'
exit 12
end
'FREE DD(SYSUT2)'
'FREE DD(SYSUT1)'
'FREE DD(SYSPRINT)'
"DELETE '"temprecv"'"
end
/* The target history file in the 'histfile' variable could be */
/* determined here based on any of the initialized variables */
/* dsn, fromid, node or faultid. This sample EXEC uses a single */
/* history file only. */ ❾
/* Perform IDIUTIL IMPORT. */
'ALLOC DD(SYSIN) NEW REU UNIT(VIO) RECFM(F B) LRECL(80)'
"ALLOC DD(SYSPRINT) SYSOUT"
if use_exit = 'Y' then
parms.1 = "EXITS(IMPORT(REXX(IDIROBEX)))"
else
parms.1 = "* Using IDIOPTLM for dump data set names"
parms.2 = "IMPORT("histfile","
parms.3 = " "temphist"("faultid"),PACKAGE)"
parms.0 = 3
"EXECIO * DISKW SYSIN (STEM parms. FINIS"
address tso "CALL *(IDIUTIL)"
say 'IMPORT rc =' RC
end
else do
/* Sleep for 60 seconds before attempting to receive again */
address tso "call *(idisleep) '"seconds"'"
end
end
- ❺
- この項目は、受信された障害項目が組み込まれるターゲット・ヒストリー・ファイルの名前です。障害が最初に発生した場所に基づくヒストリー・ファイルを選択するには、❾ を参照してください。
- ❻
- この項目は、TSO 受信コマンドに使用されるステージング・データ・セットルです。このデータ・セットから障害項目がターゲット・ヒストリー・ファイルにインポートされます。重要: 事前割り振りデータ・セットは使用しないでください。例に示したように、exec により、受信した各障害に対するこのステージング・データ・セットを割り振りおよび削除します。
IDIROBOT exec および IDIUTIL IMPORT 処理が動作する場合、ステージング・データ・セットは通常のヒストリー・ファイルとして使用されることや、複数のメンバーを含むことはできません。通常のヒストリー・ファイルとして使用される場合 (例えば、「障害項目リスト」画面を使用して表示される場合や、IDIUTIL FILES または LISTHF 制御ステートメントのターゲットとして使用される場合)、$$INDEX メンバーが作成される可能性があり、それにより処理が動作しなくなります。また、データ・セットが管理対象の IDIS サブシステムになる可能性があり、それにより後でシリアライズの問題が発生する可能性があります。
ステージング・データ・セットが受信および IMPORT 処理の間でのみ存在するようにすることで、これらの問題が発生する可能性が排除されます。
- ❼
- IDIROBOT exec は、WAIT 状態に入って、受信される障害項目のチェック間でリソースを保持します。障害項目の受信相互間の時間間隔 (秒数) をここに指定できます。選択されたユーザー ID の JES 出力キュー上の障害項目がすべて受信され、IDIROBOT exec が WAIT に移行します。
- ❽
-
- RFRDSN、XDUMPDSN および SDUMPDSN オプションが IDIOPTLM 構成オプション・ロード・モジュールで有効なデータ・セット名のパターンに設定された場合、IDIROBEX ユーザー出口を使用する必要はありません。(Fault Analyzer 構成オプション・モジュールを使用した IDIOPTLM のカスタマイズ を参照)。この場合、「use_exit」は「N」に設定します。
- IDIROBEX ユーザー出口を使用する場合、出口により提供されるダンプ・データ・セット名は IDIOPTLM の同等のオプション設定を上書きします。
- ❾
- このサンプル exec では、受信されるすべての障害項目に対して 1 つのターゲット・ヒストリー・ファイルのみが使用されます。以下のいずれかの項目に基づくターゲット・ヒストリー・ファイルを割り当てることができます。
- 元のヒストリー・ファイル名 (変数「dsn」)。
- 送信ユーザー ID (変数「fromid」)。
- 送信元のノード ID (変数「node」)。
- 障害 ID 自体 (変数「faultid」)。
//IDISTSOB JOB <job card parameters>
// SET EXECDSN=exec.lib <--- verify/change
//TSOBATCH EXEC PGM=IKJEFT01
//SYSEXEC DD DISP=SHR,DSN=&EXECDSN.
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSTSIN DD *
IDIROBOT
/*
//IDIEXEC DD DISP=SHR,DSN=*.TSOBATCH.SYSEXEC
//IDITRACE DD SYSOUT=*
IDIROBOT exec は終了しないため、IDISTSOB ジョブは無期限に実行されます。ただし、不必要なリソースを使用しないように、この exec により、ジョブが着信データの受信試行間で WAIT 状態に入ります。ジョブを終了するには、非アクティブ期間に MVS™ CANCEL コマンドを使用してください。または、選択されたユーザー ID に送信されると出口を終了させる特定のファイルを、exec に認識させることもできます。
JES イニシエーターを起動しないようにするために、この JCL を実行するための開始済みタスクを代わりに定義できます。