5.4.4 ステップ4: CORBAサーバー・アプリケーションの記述

CORBAサーバー・アプリケーションでトランザクションを使用する場合は、インタフェースの操作を実装するメソッドを記述する必要があります。Transactionsサンプル・アプリケーションでは、register_for_courses()操作のメソッド実装を記述します。

Oracle Tuxedo CORBAアプリケーションでデータベースを使用する場合は、XAリソース・マネージャをオープンおよびクローズするコードがCORBAサーバー・アプリケーションで必要となります。それらの操作は、ServerオブジェクトのServer::initialize()操作とServer::release()操作に含められます。

次のコード・スニペットに、XAリソース・マネージャをオープンおよびクローズするTransactionsサンプル・アプリケーションのServerオブジェクトのコードの部分を示します。

ノート:

トランザクションを実装するC++サーバー・アプリケーションの完全な例については、Oracle Tuxedoオンライン・ドキュメントの『CORBAトランザクションの使用』のTransactionサンプル・アプリケーションを参照してください。
CORBA::Boolean Server::initialize(int argc, char* argv[]) {
  TRACE_METHOD("Server::initialize");

  try {
    open_database();
    begin_transactional();
    register_fact();
    return CORBA_TRUE;
  }

  catch (CORBA::Exception& e) {
    LOG("CORBA exception : "<<e);
  }

  catch (SamplesDBException& e) {
    LOG("Can’t connect to database");
  }

  catch (...) {
    LOG("Unexpected exception");
  }

  cleanup();
  return CORBA_FALSE;
}

void Server::release() {
  TRACE_METHOD("Server::release");
  cleanup();
}

static void cleanup() {
  unregister_factory();
  end_transactional();
  close_database();
}

// Utilities to manage transaction resource manager
CORBA::Boolean s_became_transactional=CORBA_FALSE;

static void begin_transactional() {
  TP: :open_xa_rm();
  s_became_transactional=CORBA_TRUE;
}

static void end_transactional() {
  if( !s_became_transactional) {
    // cleanup not necessary
    return;
  }

  try {
    TP: :close_xa_rm ();
  }

  catch (CORBA::Exception& e) {
    LOG("CORBA Exception : "<< e);
  }

  catch (...) {
    LOG("unexpected exception");
  }

  s_became_transactional=CORBA_FALSE;
}