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:
Enables bidirectional IIOP for all POAs and for all outgoing connections. This setting is equivalent to creating all POAs with a setting of the BiDirectional policy to both and setting the policy override for the BiDirectional policy to both on the VisiBroker ORB level. Furthermore, all created SCMs will permit bidirectional connections, as if the exportBiDir property had been set to true for every SCM. Causes the server to accept and use connections that are bidirectional. This is equivalent to setting the importBiDir property on all SCMs to true. The vbroker.se.<sename>.scm.<scmname>.manager.exportBiDir property is a client-side property. By default, it is not set to anything by the VisiBroker ORB.Setting it to true enables creation of a bidirectional callback POA on the specified server engine.Setting it to false disables creation of a bidirectional POA on the specified server engine.The vbroker.se.<se-name>.scm.<scm-name>.manager.importBiDir property is a server-side property. By default, it is not set to anything by the VisiBroker ORB.Setting it to true allows the server-side to reuse the connection already established by the client for sending requests to the client.Setting it to false prevents reuse of connections in this fashion.These properties are evaluated only once - when the SCMs are created. In all cases, the exportBiDir and importBiDir properties on the SCMs govern the enableBiDir property. In other words, if both properties are set to conflicting values, the SCM-specific properties take effect. This allows you to set the enableBiDir property globally and specifically turn off BiDir in individual SCMs.To enable bidirectional IIOP for the callback example, you set the vbroker.orb.enableBiDir property as follows:The client in directory <install_dir>\examples\vbe\bidir-iiop\basic is derived from the RegularClient described in “Enabling bidirectional IIOP for existing applications”, except that this client enables bidirectional IIOP programmatically.
3 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;
}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).