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

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

2.2.2 同期型呼び出しをするサーバアプリケーションの例(C++)

同期型呼び出しをするサーバアプリケーションの処理の流れとコードの例を示します。斜体で示しているコードは,雛形クラスとして自動生成される部分です。

サーバアプリケーションの作成時には,ユーザは,自動生成された雛形クラスABC_TSCimplにTSCユーザオブジェクトのコードを記述します。また,雛形クラスABC_TSCfactimplにTSCユーザオブジェクトファクトリのコードを記述します。

<この項の構成>
(1) TSCユーザオブジェクト(ABC_TSCimpl)とTSCユーザオブジェクトファクトリ(ABC_TSCfactimpl)のヘッダのコード
(2) TSCユーザオブジェクト(ABC_TSCimpl)とTSCユーザオブジェクトファクトリ(ABC_TSCfactimpl)のコード
(3) サービス登録処理の流れ
(4) サービス登録処理のコード

(1) TSCユーザオブジェクト(ABC_TSCimpl)とTSCユーザオブジェクトファクトリ(ABC_TSCfactimpl)のヘッダのコード

 
//
// "ABCfile_TSC_t.hh"
//
#ifndef _ABCfile_TSC_T_HDR
#define _ABCfile_TSC_T_HDR
 
#include <tscobject.h>
 
#include "ABCfile_TSC_s.hh"
 
class ABC_TSCfactimpl : public TSCObjectFactory
{
public:
  // コンストラクタの引数の数および型を変更することもできます。
  ABC_TSCfactimpl();
 
  virtual ~ABC_TSCfactimpl();
 
  virtual TSCObject_ptr create();
  virtual void destroy(TSCObject_ptr tsc_object);
 
};
 
class ABC_TSCimpl : public ABC_TSCsk
{
private:
 
public:
  // コンストラクタの引数の数および型を変更することもできます。
  ABC_TSCimpl();
  ABC_TSCimpl(const char* _tpbroker_object_name);
 
  virtual ~ABC_TSCimpl();
 
  void call(const sampleOctetSeq& in_data,
                 sampleOctetSeq*& out_data);
 
  // メソッドが呼ばれた回数
  CORBA::Long m_counter;
 
};
 
#endif  // _ABCfile_TSC_T_HDR

(2) TSCユーザオブジェクト(ABC_TSCimpl)とTSCユーザオブジェクトファクトリ(ABC_TSCfactimpl)のコード

 
//
//  "ABCfile_TSC_t.cpp"
//
#include "ABCfile_TSC_t.hh"
 
ABC_TSCfactimpl::ABC_TSCfactimpl()
{
  // Constructor of factory implementation.
  // Write user own code.
  // TSCユーザオブジェクトファクトリのコンストラクタのコードを記述
  // します。引数の数および型を変更することもできます。
}
 
ABC_TSCfactimpl::~ABC_TSCfactimpl()
{
  // Destructor of factory implementation.
  // Write user own code.
  // TSCユーザオブジェクトファクトリのデストラクタのコードを記述
  // します。
}
 
TSCObject_ptr
ABC_TSCfactimpl::create()
{
  // Method to create user object.
  // Write user own code.
  // サーバオブジェクトを生成するコードを記述します。
  // 必要に応じて変更してください。
  return new ABC_TSCimpl();
}
 
void
ABC_TSCfactimpl::destroy(TSCObject_ptr tsc_obj)
{
  // Method to destroy user object.
  // Write user own code.
  // ここに後処理のコードを記述します。
  // 必要に応じて変更してください。
  delete tsc_obj;
}
 
ABC_TSCimpl::ABC_TSCimpl()
{
  // Constructor of implementation.
  // Write user own code.
  // TSCユーザオブジェクトのコンストラクタのコードを記述します。
  // 引数の数および型を変更することもできます。
}
 
ABC_TSCimpl::ABC_TSCimpl(const char* _tpbroker_object_name)
                       : ABC_TSCsk(_tpbroker_object_name)
{
  // Constructor of implementation.
  // Write user own code.
  // TSCユーザオブジェクトのコンストラクタのコードを記述します。
  // 引数の数および型を変更することもできます。
}
 
ABC_TSCimpl::~ABC_TSCimpl()
{
  // Destructor of implementation.
  // Write user own code.
  // ユーザオブジェクトのデストラクタのコードを記述します。
}
 
void ABC_TSCimpl::call(const sampleOctetSeq& in_data,
                            sampleOctetSeq*& out_data)
{
  // Operation "::ABC::call".
  // Write user own code.
  // ユーザメソッドのコードを記述します。
  out_data = new sampleOctetSeq();
  out_data->length(0);
 
  // メソッドが呼ばれた回数を増加させます。
  // (このメソッドの処理は引数の値と無関係です)
  printf("Call method in ABC_TSCimpl\n");
}

(3) サービス登録処理の流れ

  1. TPBrokerの初期化処理
  2. TPBroker OTMの初期化処理
  3. TSCデーモンへの接続
  4. TSCユーザオブジェクトファクトリ,TSCユーザアクセプタの生成(new),および各種設定
  5. TSCルートアクセプタの生成および各種設定
  6. TSCルートアクセプタの活性化
  7. 実行制御の受け渡し
  8. TSCルートアクセプタの非活性化
  9. TSCルートアクセプタの削除
  10. TSCユーザオブジェクトファクトリおよびTSCユーザアクセプタの削除(delete)
  11. TSCデーモンへの接続解放
  12. TPBroker OTMの終了処理

(4) サービス登録処理のコード

 
//
// "Server.cpp"
//
#include <stdio.h>
#include <iostream.h>
 
#include <tscadm.h>
#include <tscobject.h>
#include <tscexcept.h>
 
#include "ABCfile_TSC_t.hh"
 
#define ERR_FORMAT
    "EC=%d,DC=%d,PC=%d,CS=%d,MC1=%d,MC2=%d,MC3=%d,MC4=%d\n"
 
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::initServer(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::endServer();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  TSCServer_ptr tsc_server = 0;
 
  try
  {
    // TSCデーモンの参照オブジェクトを取得
    tsc_server = TSCAdm::getTSCServer(tsc_domain);
  }
  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::endServer();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  ////////
  // 4, TSCユーザオブジェクトファクトリ,TSCユーザアクセプタ(new),
  //    および各種設定
  ////////
 
  // ABC_TSCfactimplの生成
  TSCObjectFactory_ptr my_obj_fact = new ABC_TSCfactimpl();
 
  // TSCAcceptorの生成
  TSCAcceptor_ptr my_acpt = 0;
 
  try
  {
    my_acpt = new ABC_TSCacpt(my_obj_fact);
  }
  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_obj_fact;
      TSCAdm::releaseTSCServer(tsc_server);
      TSCAdm::endServer();
      exit(1);
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  ////////
  // 5, TSCルートアクセプタの生成および各種設定
  ////////
 
  // TSCRootAcceptorの生成
  TSCRootAcceptor_ptr my_rt_acpt = 0;
 
  try
  {
    my_rt_acpt = TSCRootAcceptor::create(tsc_server);
  }
  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_acpt;
      delete my_obj_fact;
      TSCAdm::releaseTSCServer(tsc_server);
      TSCAdm::endServer();
      exit(1);
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  try
  {
    // TSCRootAcceptorへの登録
    my_rt_acpt->registerAcceptor(my_acpt);
 
    // TSCRootAcceptorのパラレルカウント指定もできます。
    // デフォルト値は1
    // オプション引数でデフォルト値を変更することもできます。
    // my_rt_acpt->setParallelCount(5);
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    try
    {
      TSCRootAcceptor::destroy(my_rt_acpt);
      delete my_acpt;
      delete my_obj_fact;
      TSCAdm::releaseTSCServer(tsc_server);
      TSCAdm::endServer();
      exit(1);
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  ////////
  // 6, TSCルートアクセプタの活性化
  ////////
 
  try
  {
    // オブジェクトの活性化
    my_rt_acpt->activate("serviceX");
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    try
    {
      TSCRootAcceptor::destroy(my_rt_acpt);
      delete my_acpt;
      delete my_obj_fact;
      TSCAdm::releaseTSCServer(tsc_server);
      TSCAdm::endServer();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  ////////
  // 7, 実行制御の受け渡し
  ////////
 
  try
  {
    TSCAdm::serverMainloop();
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    try
    {
      my_rt_acpt->deactivate();
      TSCRootAcceptor::destroy(my_rt_acpt);
      delete my_acpt;
      delete my_obj_fact;
      TSCAdm::releaseTSCServer(tsc_server);
      TSCAdm::endServer();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  ////////
  // 8, TSCルートアクセプタの非活性化
  ////////
 
  try
  {
    // オブジェクトの非活性化
    my_rt_acpt->deactivate();
  }
  catch(TSCSystemException& se)
  {
    // 例外処理
    fprintf(stderr, ERR_FORMAT,
       se.getErrorCode(), se.getDetailCode(),
       se.getPlaceCode(), se.getCompletionStatus(),
       se.getMaintenanceCode1(), se.getMaintenanceCode2(),
       se.getMaintenanceCode3(), se.getMaintenanceCode4());
    try
    {
      TSCRootAcceptor::destroy(my_rt_acpt);
      delete my_acpt;
      delete my_obj_fact;
      TSCAdm::releaseTSCServer(tsc_server);
      TSCAdm::endServer();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  ////////
  // 9, TSCルートアクセプタの削除
  ////////
 
  TSCRootAcceptor::destroy(my_rt_acpt);
 
  ////////
  // 10, TSCユーザオブジェクトファクトリおよびTSCユーザアクセプタの
  //     削除(delete)
  ////////
 
  delete my_acpt;
  delete my_obj_fact;
 
  ////////
  // 11, TSCデーモンへの接続解放
  ////////
 
  try
  {
    TSCAdm::releaseTSCServer(tsc_server);
  }
  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::endServer();
    }
    catch(TSCSystemException& se)
    {
      exit(1);
    }
    exit(1);
  }
 
  delete tsc_domain;
 
  ////////
  // 12, TPBroker OTMの終了処理
  ////////
 
  try
  {
    TSCAdm::endServer();
  }
  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);
 
};