C/400

128. QWTRTVTA : スレッド属性検索API

QWTRTVTA : スレッド属性検索 API とは実行中の JOB 属性を検索できる API である。
では JOB を検索する API : QUSLJOB や QUSRJOBI とはどのように違うのだろう?
QUSRJOBI ではなく QWTRTVTA を使わなければならない理由とは何だろうか?

QWTRTVTA のパラメータ
No パラメータ 入出力 属性
1 レシーバー変数 出力 Char(*)
2 レシーバー変数の長さ 入力 Bin(4)
3 形式名 入力 Char(8)
4 JOB識別情報 入力 Char(*)
5 JOB識別情報の形式 入力 Char(8)
6 戻すフィールド数 入力 Bin(4)
7 戻すフィールドのキー 入力 Bin(4)の配列
8 パフォーマンス統計をリセットする 入力 Char(1)
9 エラー・コード 入力 Char(*)

[参考] https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/apis/qwtrtvta.htm

【 TESTRTVA: ジョブの実行中の状況を調べる例 】

0001.00 #include <stdio.h>                                                
0002.00 #include <stdlib.h>                                               
0003.00 #include <string.h>                                               
0004.00 #include <QWTRTVTA.h>                                             
0005.00 #include <QUSEC.h>                                                
0006.00                                                                   
0007.00 #define TRUE         0                                            
0008.00 #define FALSE       -1                                            
0009.00                                                                   
0010.00 void main(void){                                                  
0011.00   char outbuf[1000];                                              
0012.00   Qwt_RTVT0100_t *qwt_rtv0100;                                    
0013.00   Qwt_RTVT_Receiver_InfoData_t *info;                             
0014.00   char active_job_status[100];                                    
0015.00   int end_job_reason;                                             
0016.00   Qwc_JIDF0100_t jobinfo;                                         
0017.00   int keys[2] = {                                                 
0018.00     QWCA_KEY_ACTIVEJOBSTATUS,                                     
0019.00     QWCA_KEY_JOBENDREASON                                         
0020.00   };                                                              
0021.00   Qus_EC_t errcode = {0, 0};                                      
0022.00                                                                   
0023.00    printf("** TESTRTVA : QWTRTVTA :  スレッド属性の取得 **\n");   
0024.00    getchar();                                                              
0025.00                                                                            
0026.00    memset(&jobinfo, 0, sizeof(jobinfo));                                   
0027.00    memcpy(jobinfo.Job_Name, "QPADEV0021", 10);                             
0028.00    memcpy(jobinfo.User_Name, "QTR       ", 10);                            
0029.00    memcpy(jobinfo.Job_Number, "781441", 6);                                
0030.00    memset(jobinfo.Int_Job_ID, ' ', sizeof(jobinfo.Int_Job_ID));            
0031.00    jobinfo.Thread_Indicator = -1;                                          
0032.00    QWTRTVTA(outbuf, sizeof(outbuf), "RTVT0100", &jobinfo,                  
0033.00             "JIDF0100", 2, (void*)&keys, "0", &errcode);                   
0034.00    qwt_rtv0100 = (void*)outbuf;                                            
0035.00    /* Active job Status */                                                 
0036.00    info = (void*)(&outbuf[qwt_rtv0100->Offset_Key_Fields]);                
0037.00    memset(active_job_status, 0, sizeof(active_job_status));                
0038.00    memcpy(active_job_status, &info[1], info->Length_Data);                 
0039.00    /* End Job Reason */                                                    
0040.00    info = (void*)((char*)info + info->Length_Field_Info_Rtnd);             
0041.00    memcpy(&end_job_reason, &info[1], sizeof(end_job_reason));              
0042.00    printf("[%d] active_job_status = [%s]\n", __LINE__, active_job_status); 
0043.00    printf("[%d] end_job_reason = [%d]\n", __LINE__, end_job_reason);       
0044.00    getchar();                                                              
0045.00 }  

【 解説 】

この例では JOB : QPADEV0021 QTR 781441 の JOB に対して
API : QWTRTVTA によって JOB 情報を検索して
Active Job Status (実行中のジョブ状況) と End Job Reason (終了の理由) を調べている。

調べることのできる属性は

0017.00   int keys[2] = {                                                 
0018.00     QWCA_KEY_ACTIVEJOBSTATUS,                                     
0019.00     QWCA_KEY_JOBENDREASON                                         

のように定義している。
これが「戻すフィールドのキー」であってこの場合は 2 つのキーを指定している。

QWCA_KEY_ACTIVEJOBSTATUS は活動中のジョブの状況を要求するし、
QWCA_KEY_JOBENDREASON は既に JOB が終了してしまったのであれば
その理由を検索する。

この 2 つの情報を一回の実行だけで同時に取得できる API は QWTRTVTA だけである。
実行ジョブ情報の取得には様々な API が用意されているがどの API で
どのような情報を取得できるようにまとめた文書が IBM から提供されていて
このような情報を取得したい場合に、どの API を使うべきかの判断を助けるのに
非常に役に立つ。

AutoWeb では仮想端末 API で対話する相手の実際のジョブが活動中であるかどうかを
調べるために QWTRTVTA を利用している。
以前は QUSLJOB によって活動状態を調べていたが現在ではその理由も同時に
調べることのできる QWTRTVTA によって調査している。
AutoWeb はこのように常にパフォーマンスも含めてよりよい製品になるように
常時、機能改善が図られている。

【 参考 】

API : QWTRTVTA は OS V5R2M0 で初めて発表されたので日本語訳は存在していない。
日本語で読みたい場合はこのサイトの 22. Google Chrome で API も日本語表示
を参考にすること。