MessageQueueDirector説明書
|
目次
索引

|
B.2 メッセージ監視プログラムの記述例 (C言語の場合)
付図B.2に、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 */
All Rights Reserved, Copyright(C) 富士通株式会社 2005