examples/vbe/bidir-iiop/basicディレクトリのClientは,「27.4 既存のアプリケーションで双方向IIOPを有効にする」で記述したClientから派生します。ただし,このクライアントはプログラムによって双方向IIOPを有効にします。
クライアントコードだけを変更する必要があります。一方向クライアントを双方向クライアントに変換するには,次に示す操作を行うだけです。
次に示すコードの抜粋では,双方向IIOPをインプリメントするコードをボールド体で示します。
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;
}
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);
. . .
クライアントコネクションは一方向または双方向のどちらでもかまいません。サーバは双方向コネクションを使用して,新しいコネクションをオープンしないでクライアントをコールバックできます。コネクションがこれ以外の場合,一方向コネクションとみなされます。
コールバックオブジェクトのホストとなる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例外が発生します。
prompt>Client -Dvbroker.se.iiop_tp.scm.iiop_tp.manager.exportBiDir¥
=true
prompt>vbj -Dvbroker.se.iiop_tp.scm.iiop_tp.manager.¥
exportBiDir=true Client