メッセージ監視プログラムの記述例 (C言語)に、Interstage(コンポーネントトランザクションサービス)のサーバアプリケーションを呼び出すメッセージ監視プログラムの記述例を示します。
なお、Interstageのサーバアプリケーションの呼出し方法の詳細については、“アプリケーション作成ガイド(CORBAサービス編)”を参照してください。
/*------------------------------------------------------------------------*/ /* メッセージ監視プログラム (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 */