JP1イベントを取得するための作業手順を示します。
作業の流れは次のとおりです。
(1) 取得するJP1イベントの種類とイベント属性を決める
JP1/Baseでは,さまざまな種類の事象がJP1イベントとしてイベントDBに登録されます。まず,このイベントDBの中からどのような種類のJP1イベントを取得するかを決めます。
次に,そのJP1イベントからどのイベント属性を取得すればよいかを決めます。取得するイベント属性を決めるときは,そのアプリケーションの情報として何が必要かを考えます。アプリケーション単位で,取得するすべてのJP1イベントのイベント属性をあらかじめ決めておきます。
ここでは,「2.2.1(1) 発行するJP1イベントの種類とイベント属性を決める」でJP1イベントとして発行したSAMPLEアプリケーションの「開始イベント」の取得を例に説明します。
(2) 取得するJP1イベントをイベント取得フィルターによって指定する
必要なJP1イベントだけを取得するには,イベント取得フィルターを定義する必要があります。イベント取得フィルターの文法の詳細については,マニュアル「JP1/Base 運用ガイド」の,フィルターの文法の項を参照してください。ここでは,「2.2.1(1) 発行するJP1イベントの種類とイベント属性を決める」で示したSAMPLEアプリケーションの「開始イベント」を取得するためのイベント取得フィルターの例を次に示します。
まず,「開始イベント」を取得するために,次に示す条件を付けたイベント取得フィルターを作成することを検討します。
上記条件に合致するJP1イベントを取得対象にすることで,「開始イベント」が取得できるようになります。上記条件に合致するイベント取得フィルターの例を次に示します。
B.ID IN 00000001
E.SEVERITY IN Notice
E.PRODUCT_NAME IN /COMPANY/APP1/ SAMPLE_PRODUCT
(3) JP1イベント取得関数を使用してコーディングする
ほかのJP1プログラムやユーザーアプリケーションがJP1イベントを取得する場合,JP1イベント取得関数を利用します。JP1/BaseのイベントDBからJP1イベントを取得するには,次の順序でJP1イベント取得関数を発行します。
JP1イベント取得関数の詳細については,「3. 関数」を参照してください。また,取得できるイベント属性がどのようなものであるかについては,「付録A JP1イベントの属性の設定基準」を参照してください。
ここでは,「2.2.1(1) 発行するJP1イベントの種類とイベント属性を決める」に示したSAMPLEアプリケーションの「開始イベント」を取得するためのコーディング例を次に示します。
#include <stdio.h>
#include <string.h>
#include "JevApi.h"
int get_start_event()
{
int rc; /* リターンコード */
long position; /* イベントDB内の通し番号 */
long status; /* 状態コードアドレス */
char filter[256]; /* フィルター文バッファー */
const char *server; /* イベントサーバ名 */
const char *message; /* メッセージへのポインターのアドレス */
const char *name; /* 拡張属性名へのポインターのアドレス */
const char *value; /* 拡張属性値へのポインターのアドレス */
JEVGETKEY key; /* JP1イベント取得用ハンドル */
JP1EVENT event; /* JP1イベントアクセス用ハンドル */
JEVACCESSTYPE access; /* JP1イベントが存在しない場合の動作 */
/* 必要なJP1イベントを取得するためのフィルター文を設定します */
strcpy(filter, "B.ID IN 00000001¥n");
strcat(filter, "E.SEVERITY IN Notice¥n");
strcat(filter,
"E.PRODUCT_NAME IN /COMPANY/APP1/SAMPLE_PRODUCT");
/* 物理ホストのイベントサーバに接続します */
status = 0;
/* 接続先は物理ホストのイベントサーバ */
server = NULL;
/* 取得の基点はイベントDB内の通し番号0以降から */
position = 0;
key = JevGetOpen(&status, server, filter, position);
if(key == NULL){
fprintf(stderr,
"JevGetOpen() failed. Status = %ld¥n",
status);
return -1;
}
/* フィルターに合致するJP1イベントを全件取得します */
while(1) {
status = 0;
/* 該当するJP1イベントがなければエラーリターン */
access = JEVGET_NOWAIT;
event = JevGetEvent(&status, key, access);
if(event == NULL){
if(status == JEV_S_NO_EVENT) {
/* 該当するJP1イベントはこれ以上存在しません */
break;
}
else {
/* JP1イベント取得時にエラーが発生しました */
fprintf(stderr,
"JevGetEvent() failed. Status = %ld¥n",
status);
JevGetClose(&status, key);
return -1;
}
}
/* メッセージを取得します */
status = 0;
rc = JevGetMessage(&status, event, &message);
if(rc < 0){
fprintf(stderr,
"JevGetMessage() failed. Status = %ld¥n",
status);
JevFreeEvent(&status, event);
JevGetClose(&status, key);
return -1;
}
else{
printf("JevGetMessage() message = %s¥n", message);
}
/* (最初の)拡張属性を取得します */
status = 0;
rc = JevGetFirstExtAttr(&status, event, &name, &value);
if(rc < 0){
fprintf(stderr,
"JevGetFirstExtAttr() failed. Status = %ld¥n",
status);
JevFreeEvent(&status, event);
JevGetClose(&status, key);
return -1;
}
else{
printf("JevGetFirstExtAttr() name = %s¥n", name);
printf("JevGetFirstExtAttr() value = %s¥n", value);
}
/* (継続の)拡張属性を取得します */
while(1) {
status = 0;
rc = JevGetNextExtAttr(&status, event, &name, &value);
if(rc < 0 ){
if(status == JEV_S_EXTATTR_EOD) {
/* 拡張属性はこれ以上存在しません */
break;
}
else {
/* 拡張属性の取得でエラーが発生しました */
fprintf(stderr,
"JevGetNextExtAttr() failed.
Status = %ld¥n", status);
JevFreeEvent(&status, event);
JevGetClose(&status, key);
return -1;
}
}
else {
printf("JevGetNextExtAttr() name = %s¥n", name);
printf("JevGetNextExtAttr() value = %s¥n", value);
}
}
/* 取得したJP1イベント用メモリーを解放します */
rc = JevFreeEvent(&status, event);
if(rc < 0){
fprintf(stderr,
"JevFreeEvent() failed. Status = %ld¥n",
status);
JevGetClose(&status, key);
return -1;
}
}
/* イベントサーバから切断します */
rc = JevGetClose(&status, key);
if(rc < 0){
fprintf(stderr,
"JevGetClose() failed. Status = %ld¥n",
status);
return -1;
}
return 0;
}