Hitachi

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


27.5 双方向IIOPを明示的に有効にする

examples/vbe/bidir-iiop/basicディレクトリのClientは,「27.4 既存のアプリケーションで双方向IIOPを有効にする」で記述したClientから派生します。ただし,このクライアントはプログラムによって双方向IIOPを有効にします。

クライアントコードだけを変更する必要があります。一方向クライアントを双方向クライアントに変換するには,次に示す操作を行うだけです。

  1. BiDirectionalポリシーをコールバックPOAのポリシーのリストに入れます。

  2. BiDirectionalポリシーを,双方向IIOPを有効にしたいサーバを表すオブジェクトリファレンスの変更のリストに追加します。

  3. クライアントでexportBiDirプロパティをtrueに設定します。

次に示すコードの抜粋では,双方向IIOPをインプリメントするコードをボールド体で示します。

コードサンプル27-1 双方向IIOPのインプリメント(C++)
try {
   CORBA::ORB_var orb = CORBA::ORB_init(argc,argv);
 
   // Get the manager Id
   PortableServer::ObjectId_var managerId =
      PortableServer::string_to_ObjectId("BankManager");
   PortableServer::ObjectId_var oid = 
      PortableServer::string_to_ObjectId("QuoteServer");
   Quote::QuoteServer_var quoter =
      Quote::QuoteServer::_bind("/QuoteServer_poa",oid);
 
   //set up the callback object...first get the RootPOA
   CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
   PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(obj);
   PortableServer::POAManager_var the_manager = rootPOA->the_POAManager();
   PortableServer::POA_var consumer_poa;
 
   //Set up a policy.
   CORBA::Any policy_value;
   policy_value <<= BiDirPolicy::BOTH;
   CORBA::Policy_var policy =
      orb->create_policy(BiDirPolicy::BIDIRECTIONAL_POLICY_TYPE,
         policy_value);
 
   CORBA::PolicyList policies;
   policies.length(1);
   policies [0] = CORBA::Policy::_duplicate(policy);
 
   consumer_poa = rootPOA->create_POA("QuoteConsumer_poa"
      ,the_manager,policies );
 
   QuoteConsumerImpl* consumer = new QuoteConsumerImpl;
   oid = PortableServer::string_to_ObjectId("consumer");
   consumer_poa->activate_object_with_id(oid, consumer);
 
   the_manager->activate();
   CORBA::Object_var_obj = quoter->set_policy_overrides(
      policies,CORBA::ADD_OVERRIDE);
   quoter = Quote::QuoteServer::_narrow(_obj);
 
   obj = consumer_poa->id_to_reference(oid);
   Quote::QuoteConsumer_var quote_consumer =
      Quote::QuoteConsumer::_narrow(obj);
   quoter->registerConsumer(quote_consumer.in());
 
   cout << "implementation is running" << endl;
   orb->run();
}
catch(const CORBA::Exception& e){
   cout <<e <<endl;
}
コードサンプル27-2 双方向IIOPのインプリメント(Java)
public static void main (String[ ] args)){
      try {
      org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null);
      org.omg.PortableServer.POA rootPOA =
         org.omg.PortableServer.POAHelper.narrow(
            orb.resolve_initial_references("RootPOA"));
      org.omg.CORBA.Any bidirPolicy = orb.create_any();
      bidirPolicy.insert_short(BOTH.value);
      org.omg.CORBA.Policy[ ] policies = {
         //set bidir policy
         orb.create_policy(BIDIRECTIONAL_POLICY_TYPE.value, 
            bidirPolicy)
      };
      org.omg.PortableServer.POA callbackPOA =
         rootPOA.create_POA("bidir", rootPOA.the_POAManager(),
                                                        policies);
      QuoteConsumerImpl c = new QuoteConsumerImpl();
      callbackPOA.activate_object(c);
      callbackPOA.the_POAManager().activate();
      QuoteServer serv = QuoteServerHelper.bind(orb, 
                    "/QuoteServer_poa", "QuoteServer".getBytes());
      serv=QuoteServerHelper.narrow(serv._set_policy_override(
            policies,org.omg.CORBA.SetOverrideType.ADD_OVERRIDE));
      serv.registerConsumer(QuoteConsumerHelper.narrow(
            callbackPOA.servant_to_reference(c)));
      System.out.println("Client:consumer registered");
      //sleeping for 60 seconds,receiving message
      try{
         Thread.currentThread().sleep(60*1000);
      }
      catch(java.lang.InterruptedException e){ }
      serv.unregisterConsumer(QuoteConsumerHelper.narrow(
            callbackPOA.servant_to_reference(c)));
      System.out.println("Client: consumer unregistered.Good bye.");
      orb.shutdown(true);
. . .

ユーザのアプリケーションを調整するためにポリシーを設定する方法については,マニュアル「Borland Enterprise Server VisiBroker プログラマーズリファレンス」の「QoSインタフェースとクラス」の記述を参照してください。

クライアントコネクションは一方向または双方向のどちらでもかまいません。サーバは双方向コネクションを使用して,新しいコネクションをオープンしないでクライアントをコールバックできます。コネクションがこれ以外の場合,一方向コネクションとみなされます。

コールバックオブジェクトのホストとなるPOAは,BiDirectionalポリシーをBOTHに設定することによって双方向IIOPを有効にする必要があります。このPOAは,SCMマネージャでvbroker.se.<sename>.scm.<scmname>.manager.exportBiDirプロパティを設定して双方向サポートを有効にしてあるSCMで作成する必要があります。POAがこれ以外の場合,POAはクライアント起動コネクションによってサーバからリクエストを受信することはできません。

POAがBiDirectionalポリシーを指定しない場合,POAを出力コネクションで使用しないでください。この要件を満たすために,BiDirectionalポリシーが設定されていないPOAは,exportBiDirプロパティが設定されているSCMが一つでもあるサーバエンジン上では作成できません。一方向SEでPOAを作成しようとすると,ServerEnginePolicyがエラーとなるInvalidPolicy例外が発生します。

同じクライアントコネクションを使用している異なるオブジェクトはBiDirectionalポリシーの競合の変更を設定することがあります。しかし,一度コネクションが双方向になったら,あとでポリシーが有効になってもならなくても,常に双方向のままになります。

双方向設定に対してユーザに完全に制御が移ったら,iiop_tp SCMだけで双方向IIOPを有効にします。

C++の場合
prompt>Client -Dvbroker.se.iiop_tp.scm.iiop_tp.manager.exportBiDir\
       =true
Javaの場合
prompt>vbj -Dvbroker.se.iiop_tp.scm.iiop_tp.manager.\
       exportBiDir=true Client