Hitachi

VisiBroker Version 5 Borland(R) Enterprise Server VisiBroker(R) デベロッパーズガイド


7.4.4 デフォルトサーバントによる活性化

オブジェクトIDが何であろうとPOAに同じサーバントを起動させるには,RequestProcessing::USE_DEFAULT_SERVANTポリシー(C++),またはRequestProcessing.USE_DEFAULT_SERVANTポリシー(Java)を使用してください。これは各オブジェクトに少量のデータしか持たせていない場合に便利です。

コードサンプル7-9 同じサーバントによるすべてのオブジェクトの活性化例(C++)
int main(int argc, char* const* argv) {
   try {
      // Initialize the ORB.
      CORBA::ORB_ptr orb = CORBA::ORB_init(argc, argv);
      PortableServer::Current_var cur = 
            PortableServer::Current::_instance();
      DataStore::_create();
 
      // get a reference to the rootPOA
      CORBA::Object_var obj = 
            orb->resolve_initial_references("RootPOA");
      PortableServer::POA_var rootPOA = 
            PortableServer::POA::_narrow(obj);
 
      CORBA::PolicyList policies;
      policies.length(3);
 
      // Create policies for our persistent POA
      policies[(CORBA::ULong)0] = 
            rootPOA->create_lifespan_policy
            (PortableServer::PERSISTENT);
      policies[(CORBA::ULong)1] = 
            rootPOA->create_request_processing_policy
            (PortableServer::USE_DEFAULT_SERVANT);
      policies[(CORBA::ULong)2] = 
            rootPOA->create_id_uniqueness_policy
            (PortableServer::MULTIPLE_ID);
 
      // Create myPOA with the right policies
      PortableServer::POAManager_var rootManager = 
            rootPOA->the_POAManager();
      PortableServer::POA_var myPOA = 
            rootPOA->create_POA
            ("bank_default_servant_poa", 
            rootManager, policies);
      // Set the default servant
      AccountManagerImpl * managerServant = 
            new AccountManagerImpl(cur);
      myPOA->set_servant( managerServant );
 
      // Activate the POA Manager
      rootManager->activate();
 
      // Generate two references - one for checking 
      // and another for savings.
      // Note that we are not creating any
      // servants here and just manufacturing a reference 
      // which is not yet backed by a servant
      PortableServer::ObjectId_var an_oid = 
            PortableServer::string_to_ObjectId
            ("CheckingAccountManager");
      CORBA::Object_var cref = 
            myPOA->create_reference_with_id(an_oid.in(),
            "IDL:Bank/AccountManager:1.0");
 
      an_oid = PortableServer::string_to_ObjectId
            ("SavingsAccountManager");
      CORBA::Object_var sref = myPOA->create_reference_with_id
            (an_oid.in(), "IDL:Bank/AccountManager:1.0");
 
      // Write out Checking reference
      CORBA::String_var string_ref = 
            orb->object_to_string(cref.in());
      ofstream crefFile("cref.dat");
      crefFile << string_ref << endl;
      crefFile.close();
      // Now write out the Savings reference
      string_ref = orb->object_to_string(sref.in());
      ofstream srefFile("sref.dat");
      srefFile << string_ref << endl;
      srefFile.close();
      cout << "Bank Manager is ready" << endl;
      // Wait for incoming requests
      orb->run();
      DataStore::_destroy();
   }
   catch(const CORBA::Exception& e) {
      cerr << e << endl;
   }
   return 1;
}
コードサンプル7-10 同じサーバントによるすべてのオブジェクトの活性化例(Java)
import org.omg.PortableServer.*;
public class Server {
   public static void main(String[ ] args) {
      try {
         // Initialize the ORB.
         org.omg.CORBA.ORB orb
                       = org.omg.CORBA.ORB.init(args,null);
         // get a reference to the rootPOA
         POA rootPOA = POAHelper.narrow(
           orb.resolve_initial_references("RootPOA"));
         // Create policies for our persistent POA
         org.omg.CORBA.Policy[ ] policies = {
           rootPOA.create_lifespan_policy(
                 LifespanPolicyValue.PERSISTENT),
           rootPOA.create_request_processing_policy(
                 RequestProcessingPolicyValue.USE_DEFAULT_SERVANT
           )
         };
         // Create myPOA with the right policies
         POA myPOA = rootPOA.create_POA(
               "bank_default_servant_poa",
               rootPOA.the_POAManager(),
               policies );
         // Create the servant
         AccountManagerImpl managerServant =
                                   new AccountManagerImpl();
         // Set the default servant on our POA
         myPOA.set_servant(managerServant);
         org.omg.CORBA.Object ref;
         // Activate the POA manager
         rootPOA.the_POAManager().activate();
         // Generate the reference and write it out. One
         // for each Checking and Savings account types.
         // Note that we are not creating any servants
         // here and just manufacturing a reference
         // which is not yet backed by a servant.
         try {
           ref = myPOA.create_reference_with_id(
                               "CheckingAccountManager".getBytes(),
                               "IDL:Bank/AccountManager:1.0");
           // Write out checking object ID
           java.io.PrintWriter pw = new java.io.PrintWriter(
                 new java.io.FileWriter("cref.dat"));
           pw.println(orb.object_to_string(ref));
           pw.close();
           ref = myPOA.create_reference_with_id(
                            "SavingsAccountManager".getBytes(),
                            "IDL:Bank/AccountManager:1.0");
           // Write out savings object ID
           pw = new java.io.PrintWriter(
                  new java.io.FileWriter("sref.dat"));
           System.gc();
           pw.println(orb.object_to_string(ref));
           pw.close();
        } catch ( java.io.IOException e ){
           System.out.println("Error writing the IOR to file ");
           return;
        }
        System.out.println("Bank Manager is ready.");
        // Wait for incoming requests
        orb.run();
     }catch (Exception e){
        e.printStackTrace();
     }
   }
}