2.2.2 JP1イベントを取得する手順

JP1イベントを取得するための作業手順を示します。

作業の流れは次のとおりです。

  1. 取得するJP1イベントの種類とイベント属性を決める
  2. 取得するJP1イベントをイベント取得フィルターによって指定する
  3. JP1イベント取得関数を使用してコーディングする
  4. ソースファイルをコンパイルする
<この項の構成>
(1) 取得するJP1イベントの種類とイベント属性を決める
(2) 取得するJP1イベントをイベント取得フィルターによって指定する
(3) 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

注意事項
  • イベント取得フィルターの条件として日本語文字列を指定する場合,その文字コードは,JP1イベント取得関数実行時のロケール情報(環境変数LANGなど)と合致させてください。イベント取得フィルターの条件として指定した文字列の文字コードとJP1イベント取得関数実行時のロケール情報(環境変数LANGなど)が異なる場合,JP1イベントは取得できません。
  • イベント取得フィルターに除外条件を定義するときは,08-50以降のイベントサーバに接続してください。08-11以前のイベントサーバに接続するとエラー(JEV_S_FILTER_ERROR)になります。

(3) JP1イベント取得関数を使用してコーディングする

ほかのJP1プログラムやユーザーアプリケーションがJP1イベントを取得する場合,JP1イベント取得関数を利用します。JP1/BaseのイベントDBからJP1イベントを取得するには,次の順序でJP1イベント取得関数を発行します。

  1. JP1イベントの取得開始を要求する関数を発行する
    イベントサーバに対して関数(JevGetOpen)を使ってJP1イベントの取得開始を要求し,イベントサーバに接続します。なお,取得開始を要求するユーザーは,あらかじめJP1/Baseのイベントサーバ設定(conf)ファイルのusersパラメーターで設定する必要があります。
  2. JP1イベントの取得を要求する関数を発行する
    さまざまな関数を使ってJP1イベントを取得したり,JP1イベントに設定されたさまざまなイベント属性を取得したりします。
  3. JP1イベントの取得終了を通知する関数を発行する
    イベントサーバに対して関数(JevGetClose)を使って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;
}