QWTRTVTA : スレッド属性検索 API とは実行中の JOB 属性を検索できる API である。
では JOB を検索する API : QUSLJOB や QUSRJOBI とはどのように違うのだろう?
QUSRJOBI ではなく 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 で初めて発表されたので日本語訳は存在していない。
日本語で読みたい場合はこのサイトの
を参考にすること。