トランザクショナル分散オブジェクト基盤 TPBroker Object Transaction Monitor プログラマーズガイド

[目次][索引][前へ][次へ]

2.4.1 セション呼び出しをするクライアントアプリケーションの例(C++)

セション呼び出しをするクライアントアプリケーションの処理の流れとコードの例を示します。太字で示しているコードは,同期型呼び出しのコードと異なる部分です。

<この項の構成>
(1) サービス利用処理の流れ
(2) サービス利用処理のコード
(3) TSCユーザプロキシを呼び出すコード

(1) サービス利用処理の流れ

  1. TPBrokerの初期化処理
  2. TPBroker OTMの初期化処理
  3. TSCデーモンへの接続
  4. TSCユーザプロキシの生成および各種設定
  5. TSCユーザプロキシのメソッド呼び出し(サーバ側のオブジェクトの呼び出し)
  6. TSCユーザプロキシの削除
  7. TSCデーモンへの接続解放
  8. TPBroker OTMの終了処理

(2) サービス利用処理のコード

 
//
// "Client.cpp"
//
#include <stdio.h>
#include <iostream.h>
 
#include <corba.h>
 
#include <tscadm.h>
#include <tscproxy.h>
#include <tscexcept.h>
 
#include "ABCfile_TSC_p.hh"
 
#define ERR_FORMAT
    "EC=%d,DC=%d,PC=%d,CS=%d,MC1=%d,MC2=%d,MC3=%d,MC4=%d\n"
 
extern void callSessionService(ABC_TSCspxy_ptr abc);
 
int main(int argc, char** argv)
{
 
  ////////
  // 1, TPBrokerの初期化処理
  ////////
 
  CORBA::ORB_ptr orb = 0;
 
  try
  {
    // ORBの初期化
    orb = CORBA::ORB_init(argc, argv);
  }
  catch(CORBA::SystemException& se)
  {
    // 例外処理
    cerr << se << endl;
    exit(1);
  }
 
  ////////
  // 2, TPBroker OTMの初期化処理
  ////////
 
  try
  {
    // TSCの初期化
    TSCAdm::initClient(argc, argv, orb);
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    exit(1);
  }
 
  ////////
  // 3, TSCデーモンへの接続
  ////////
 
  TSCDomain_ptr tsc_domain = 0;
 
  try
  {
    tsc_domain = new TSCDomain(0, 0);
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    try
    {
      TSCAdm::endClient();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  TSCClient_ptr tsc_client = 0;
 
  try
  {
    tsc_client = TSCAdm::getTSCClient(tsc_domain,
    TSCAdm::TSC_ADM_REGULATOR);
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    try
    {
      TSCAdm::endClient();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  ////////
  // 4, TSCユーザプロキシの生成および各種設定
  ////////
 
  // ユーザ定義IDLインタフェース"ABC"用のTSCspxy生成
  ABC_TSCspxy_ptr my_proxy = 0;
 
  try
  {
    my_proxy = new ABC_TSCspxy(tsc_client);
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    try
    {
      TSCAdm::releaseTSCClient(tsc_client);
      TSCAdm::endClient();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  ////////
  // 5, TSCユーザプロキシのメソッド呼び出し
  //    (サーバ側のオブジェクトの呼び出し)
  ////////
 
  try
  {
    callSessionService(my_proxy);
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    try
    {
      delete my_proxy;
      TSCAdm::releaseTSCClient(tsc_client);
      TSCAdm::endClient();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  ////////
  // 6, TSCユーザプロキシの削除
  ////////
 
  delete my_proxy;
 
  ////////
  // 7, TSCデーモンへの接続解放
  ////////
 
  try
  {
    TSCAdm::releaseTSCClient(tsc_client);
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    try
    {
      TSCAdm::endClient();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  ////////
  // 8, TPBroker OTMの終了処理
  ////////
 
  try
  {
    TSCAdm::endClient();
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    exit(1);
  }
 
  exit(0);
 
};
 

(3) TSCユーザプロキシを呼び出すコード

 
//
// "callSessionService.cpp"
//
#include <stdio.h>
#include <iostream.h>
 
#include <corba.h>
 
#include <tscadm.h>
#include <tscproxy.h>
#include <tscexcept.h>
 
#include "ABCfile_TSC_p.hh"
 
#define SEND_MESSAGE_LENGTH  (256)
#define ERR_FORMAT
    "EC=%d,DC=%d,PC=%d,CS=%d,MC1=%d,MC2=%d,MC3=%d,MC4=%d\n"
 
void callSessionService(ABC_TSCspxy_ptr abc)
{
 
  ////////
  // 1, セションの開始
  ////////
 
  try
  {
    abc->_TSCStart();
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    throw;
  }
 
  ////////
  // 2, サービスの呼び出し
  ////////
 
  // in引数の準備
  sampleOctetSeq  req_data;
  req_data.length(SEND_MESSAGE_LENGTH);
  for(int i=0; i<SEND_MESSAGE_LENGTH; ++i)
  {
    req_data[i] = (unsigned char)(i%256);
  };
 
  // out引数の準備
  sampleOctetSeq*  res_data;
 
  try
  {
    for(int i=0; i<3; ++i)
    {
      // サーバのメソッドの呼び出し
      abc->call(req_data, res_data);
    }
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    try
    {
      abc->_TSCStop();
    }
    catch(TSCSystemException& se)
    {}
    throw;
  }
 
  ////////
  // 3, セションの停止
  ////////
 
  try
  {
    abc->_TSCStop();
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    throw;
  }
 
}