This section explains how to establish bidirectional connections in VisiBroker without using the GateKeeper. For information about bidirectional communications when using GateKeeper, see the VisiBroker GateKeeper Guide.Most clients and servers that exchange information by way of the Internet are typically protected by corporate firewalls. In systems where requests are initiated only by the clients, the presence of firewalls is usually transparent to the clients. However, there are cases where clients need information asynchronously, that is, information must arrive that is not in response to a request. Client-side firewalls prevent servers from initiating connections back to clients. Therefore, if a client is to receive asynchronous information, it usually requires additional configuration.The vbroker.orb.enableBiDir property can be used on both the server and the client to enable bidirectional communication. This property allows you to change an existing unidirectional application into a bidirectional one without changing any code. The following table describes the vbroker.orb.enableBiDir property value options:
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;
}The POA on which the callback object is hosted must enable bidirectional IIOP by setting the BiDirectional policy to BOTH. This POA must be created on an SCM which has been enabled for bidirectional support by setting the vbroker.<sename>.scm.<scmname>.manager.exportBiDir property on the SCM manager. Otherwise, the POA will not be able to receive requests from the server over a client-initiated connection.If a POA does not specify the BiDirectional policy, it must not be exposed in outgoing connections. To satisfy this requirement, a POA which does not have the BiDirectional policy set cannot be created on a server engine which has even one SCM whose exportBiDir property is set. If an attempt is made to create a POA on a unidirectional SE, an InvalidPolicy exception is raised, with the ServerEnginePolicy in error.Once you have full control over the bidirectional configuration, you enable bidirectional IIOP on the iiop_tp SCM only:For security reasons, a server running VisiBroker will not use bidirectional IIOP unless explicitly configured to do so. The property vbroker.<se>.<sename>.scm.<scmname>.manager.importBiDir gives you control of bidirectionality on a per-SCM basis. For example, you might choose to enable bidirectional IIOP only on a server engine that uses SSL to authenticate the client, and to not make other, regular IIOP connections available for bidirectional use. (See “Bidirectional VisiBroker ORB properties” for more information.) In addition, on the client-side, you might want to enable bidirectional connections only to those servers that do callbacks outside of the client firewall. To establish a high degree of security between the client and server, you should use SSL with mutual authentication (set vbroker.security.peerAuthenticationMode to REQUIRE_AND_TRUST on both the client and server).