![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
2 интерфейса
Dmitry Borisovets © (2002-03-14 15:20:00)у меня в CORBA-сервере 2 интерфейса. если регистрировать один, то все нормально: удаленные процедуры вызываются. возникла необходимость написать второй интерфейс. написал, реализовал, создал, а как его регистрировать? пробовал на том же orb - не катит, кидает исключения.
вот код для одного объекта, подскажите, что добавить для второго.
CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(obj);
CORBA::PolicyList policies;
policies.length(1);
policies[(CORBA::ULong)0] = rootPOA->create_lifespan_policy(PortableServer::PERSISTENT);
// get the POA Manager
PortableServer::POAManager_var poa_manager = rootPOA->the_POAManager();
// Create myPOA with the right policies
clientPOA = rootPOA->create_POA("beltel_agent_poa", poa_manager, policies);
// Create the servant
IAgentManagerImplementation clientServant;
ITapiEventsImplementation tapiServant;
// Decide on the ID for the servant
PortableServer::ObjectId_var managerId = PortableServer::string_to_ObjectId("BeltelAgent");
// Activate the servant with the ID on myPOA
clientPOA->activate_object_with_id(managerId, &clientServant);
// Activate the POA Manager
poa_manager->activate();
CORBA::Object_var clientReference = clientPOA->servant_to_reference(&clientServant);
orb->run();
paul_shmakov (2002-03-17 06:23:00) [1]кстати, я не обратил внимания, но, если мне не изменяет память, то вы в полиси должны добавить id assignment policy равное user_id, так как самостоятельно указываете object id.
CORBA::PolicyList policies;
policies.length(2);
policies[0] = rootPOA->create_lifespan_policy(PortableServer::PERSISTENT);
policies[1] = rootPoa->create_id_assignment_policy(PortableServer::USER_ID);
paul_shmakov (2002-03-17 05:38:00) [2]а второй интерфейс - это ITapiEventsImplementation чтоль? объекты первого интерфейса у вас определены как persistent. объекты второго интерфейса тоже должны быть долгоживущими? если да, то можно использовать один и тот же poa для объектов сервантов обоих типов. если нет, то нужно создать еще один poa для нового интерфейса.
ну а дальше регистрируем сервант в poa и все должно работать.
если а второй интерфейс - это все же ITapiEventsImplementation и объекты этого интерфейса дожны быть transient, а не persistent, то вот пример:
CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(obj);
CORBA::PolicyList policies;
policies.length(1);
policies[(CORBA::ULong)0] = rootPOA->create_lifespan_policy(PortableServer::PERSISTENT);
// get the POA Manager
PortableServer::POAManager_var poa_manager = rootPOA->the_POAManager();
// Create myPOA with the right policies
clientPOA = rootPOA->create_POA("beltel_agent_poa", poa_manager, policies);
CORBA::PolicyList tapiPolicies;
tapiPolicies.length(0); // полиси по умолчанию
tapiPOA = rootPOA->create_POA("tapi_agent_poa", poa_manager, tapiPolicies);
// Create the servant
IAgentManagerImplementation clientServant;
ITapiEventsImplementation tapiServant;
// Decide on the ID for the servant
PortableServer::ObjectId_var managerId = PortableServer::string_to_ObjectId("BeltelAgent");
PortableServer::ObjectId_var tapiId = PortableServer::string_to_ObjectId("BeltelTapiAgent");
// Activate the servant with the ID on myPOA
clientPOA->activate_object_with_id(managerId, &clientServant);
tapiPOA->activate_object_with_id(tapiId, &tapiServant);
// Activate the POA Manager
poa_manager->activate();
CORBA::Object_var clientReference = clientPOA->servant_to_reference(&clientServant);
// ну и ссылку получаем
CORBA::Object_var tapiReference = tapiPOA->servant_to_reference(&tapiServant);
orb->run();