ページの先頭行へ戻る
Interstage Application Server MessageQueueDirector説明書
Interstage

B.2 メッセージ監視プログラムの記述例 (C言語の場合)

メッセージ監視プログラムの記述例 (C言語)に、Interstage(コンポーネントトランザクションサービス)のサーバアプリケーションを呼び出すメッセージ監視プログラムの記述例を示します。

なお、Interstageのサーバアプリケーションの呼出し方法の詳細については、“アプリケーション作成ガイド(CORBAサービス編)”を参照してください。

メッセージ監視プログラムの記述例 (C言語)
/*------------------------------------------------------------------------*/
/*   メッセージ監視プログラム (Interstageのクライアントアプリケーション)  */
/*------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>

/* < MQDのためのデータ記述 >  */
#include "mqdapi.h"
#define   MQD_SYSNAME       "MQD001"
#define   MQD_QNAME         "Q002"
#define   MQD_BODYLENGTH     200
static    MQD_Environment    Mqdenv;
static    MQD_System*        pMqdsys  = NULL;
static    MQD_MessageQueue*  pQue     = NULL;
static    MQD_MessageHeader  Mqdheader;
static    MQD_MessageBody    Mqdbody;
static    char               Sysname [ MQD_SYSNAME_MAX ];
static    char               Qname   [ MQD_QUENAME_MAX ];
static    char               Putqname[ MQD_QUENAME_MAX ];
static    MQDCHAR*           pBody       = NULL;
static    const    long      BodyLen     = MQD_BODYLENGTH;

/* < Interstageのサーバアプリケーション呼出し用のデータ記述 >      */
/* → この記述の詳細は“アプリケーション作成ガイド                 */
/*    (CORBAサービス編)”を参照してください。                      */
#include "orb.h"
#include "OM_IMR.H"
#include "COSNAMIN.H"
#include "IS_SVR_APPL.h"         /* tdcコマンドにより生成したファイル */
#include "CosTransactions.h"

static   CORBA_ORB                orb;
static   CORBA_BOA                boa;
static   CosNaming_NamingContext  cos_naming;
static   CosNaming_Name           name;
static   CosNaming_NameComponent  name_component;
static   CORBA_Environment        env;
static   CORBA_Object             Current;

/* --------------------------------------------------------*/
/*    main                                                 */
/* --------------------------------------------------------*/
int main( int argc, char *argv[] )
{
    CORBA_Object   obj;
    CORBA_long     ret;

    int      flg_end   = 0;
    int      status    = 0;
    int      retcode   = 0;

/*---------------------------------------------------------------*/
/*   処理手続き                                                  */
/*---------------------------------------------------------------*/

/*-----------------------------------------------*/
/*   Interstageのサーバアプリケーション呼出しの  */
/*   ための前処理  ( initialization of ORB )     */
/*-----------------------------------------------*/
/* → この処理は“アプリケーション作成ガイド(CORBAサービス編)” */
/*    を参照してください。   */

    fprintf( stdout,"メッセージ受信を開始 \n" );

    /* initialize variable */
    memset( Sysname   , 0x00, MQD_SYSNAME_MAX );
    memset( Qname     , 0x00, MQD_QUENAME_MAX );
    memset( &Mqdheader, 0x00, sizeof(MQD_MessageHeader));

    /* set system name and queue name */
    strcpy( Sysname, MQD_SYSNAME );
    strcpy( Qname  , MQD_QNAME );

    pBody = (MQDCHAR *)calloc( BodyLen, sizeof(MQDCHAR));
    if ( !pBody )    /* error?   */
      {
      status = -1;
      goto EXT_PRO;
      }
    Mqdbody.data = pBody;

/*-----------------------------------------------*/
/*   MQDへの接続                                 */
/*-----------------------------------------------*/
    retcode = mqd_connect( Sysname, &Mqdenv, &pMqdsys );
    fprintf( stdout,"mqd_connect  RCODE = %d\n", retcode );
    if ( retcode != 0 )        /* error?    */
      {
      status = 1;
      goto EXT_PRO;
      }

/*-----------------------------------------------*/
/*   メッセージキューへの接続                    */
/*-----------------------------------------------*/
    retcode = mqd_connectq( pMqdsys, Qname, &Mqdenv, &pQue );
    fprintf( stdout,"mqd_connectq  RCODE = %d\n", retcode );
    if ( retcode != 0 )        /* error?    */
      {
      status = 2;
      goto EXT_DCM;
      }

    while ( flg_end = 0 )
       {
/*-----------------------------------------------*/
/*   メッセージの参照(到着待ち)                  */
/*-----------------------------------------------*/
        retcode = mqd_peekmsg( pQue, MQD_Q_MODE_SYNC, &Mqdheader, &Mqdbody, BodyLen,
MQD_Q_CURSOR_CURRENT, &Mqdenv );
        fprintf( stdout,"mqd_peekmsg  RCODE = %d\n", retcode );
        if ( retcode != 0 )        /* error?   */
          {
          status = 3;
          goto EXT_DCQ;
          }
        if ( !memcmp( pBody, "END", 3) )
          flg_end = 1;

/*-----------------------------------------------*/
/*   Interstageのサーバアプリケーションの呼出し  */
/*-----------------------------------------------*/
     /*   < トランザクション開始 >       */
        CosTransactions_Current_begin( Current, &env );
     /*   < アプリケーション呼出し >     */
        ret = IS_SVR_APPL ( obj, …, &env );
        if ( ret != 0 )    /* error?   */
          {
          status = 4;
     /*   < トランザクション異常終了 >   */
          CosTransactions_Current_rollback( Current, &env );
          goto EXT_DCQ;
          }
        else
     /*   < トランザクション正常終了 >   */
          {
          CosTransactions_Current_commit( Current, CORBA_TRUE, &env );
          }
       }

EXT_DCQ:
/*-----------------------------------------------*/
/*   メッセージキューからの切断                  */
/*-----------------------------------------------*/
    retcode = mqd_disconnectq( pQue, &Mqdenv );
    fprintf( stdout,"mqd_disconnectq  RCODE = %d\n", retcode );
    if ( retcode != 0 )        /* error?   */
      status = 5;

EXT_DCM:
/*-----------------------------------------------*/
/*   MQDからの切断                               */
/*-----------------------------------------------*/
    retcode = mqd_disconnect( pMqdsys, &Mqdenv );
    fprintf( stdout,"mqd_disconnect  RCODE = %d\n", retcode );
    if ( retcode != 0 )        /* error?   */
      status = 6;

EXT_PRO:
/*-----------------------------------------------*/
/*   Interstageのサーバアプリケーション呼出しの  */
/*   ための後処理                                */
/*-----------------------------------------------*/
/* → この処理は“アプリケーション作成ガイド(CORBAサービス編)” */
/*    を参照してください。   */

    (void)free( pBody );

    return( status );
}  /*  End of MSGWAIT_PROG  */