Параллельное и распределенное программирование на С++
Шрифт:
1 int main(int argc, char *argv[])
2 {
3
4 try{
5 CORBA::ORB_var Orb = CORBA::ORB_init(argc,argv,«mico-local-orb»);
6 object_reference Remote(«NameService»,Orb);
7 Remote.objectName(«Inflection»);
8 permutation_var Client =permutation::_narrow(Remote.objectReference);
9 char Value[1000];
strcpy(Value,«Common Object Request Broker»);
11 Client->original(Value);
12 int N;
12 for(N = 0;N < 15;N++)
14 {
15 cout « «Значение функции nextPermutation "<< Client- >nextPermutation « endl;
16 )
17 }
18 catch(CosNaming::NamingContext::NotFound_catch &exc) {
19 cerr << " Исключение: объект не обнаружен.» « endl;
20 }
21 catch(CosNaming::NamingContext::InvalidName_catch &exc) {
22 cerr << «Исключение: некорректное имя.» « endl;
23 }
24
25 return(0);
26 }
Для
1. Получить ссылку на службу имен.
2. С помощью службы имен получить ссылку на соответствующий именной контекст.
3. С помощью именного контекста получить ссылку иа соответствующий объект.
Действие 1 реализуетс я путе м вызова м ето д а resolve_initial_references:
//.. .
CORBA::Object_var NameService;
NameService = Orb->resolve_initial_references
(«NameService»);
//...
Функция resolve_initial_references возвратит объектную ссылку на службу имен. В действии 2 эта ссылка используетс я дл я получения объектной ссылки на именной контекст:
CosNaming: :NamingContext_var NameContext; NameContext = CosNaming::NamingContext::_narrow
(NameService);
В действии 3 значение объектной ссылки NameService «сужается», т.е. приводится к соответствую щ ему типу, в результате чего получаетс я объектнал ссылка на и м енной контекст NameContext. С по м ощью объекта NameContext програ мм а-потребитель может вызвать его м етод resolve. Строки 24-27 из програ мм ы8.3 используютс я дл я построени я и м ени, которое и будет передано м етолу resolve .
Name .length (1);
Name[Q].id = CORBA::string_dup («Inflection»); Name[C].kind = CORBA::string_dup (""); try {
ObjectReference = NameContext->resolve (Name);
}
Метод resolve возвращает объектную ссылку, связанную с заданным именем объекта. В данном случае задано имя «Inflection». Обратите внимание на то, что такое же имя связывается с именным контекстом в программе8.3 (строка28). Если программа-потребитель имеет объектную ссылку, она может ее «сузить», а затем с ее помощью получить доступ к удаленному объекту. Процесс получения объектной ссылки на удаленный объект вполне тривиален, и поэтому имеет смысл его упростить путем инкапсуляции соответствующих компонентов в классе.
class object_reference{ //.. .
protected:
CORBA::Object_var NameService;
CosNaming::NamingContext_var NameContext;
CosNaming::Name Name;
CORBA::Object_var ObjectReference; public:
object_reference(char *Service,CORBA::ORB_var Orb);
CORBA::Object_var objectReference(void);
void objectName(char *FileName,CORBA::ORB_var Orb);
void objectName(char *OName); //. . . }
Про г рамма 8.4 использует преи м у щ ества просто г о каркасно г о к л асса obj ect_reference, который м ы создали с этой целью.
В про г ра мм е 8.4 (строка 6) обратите вни м
ание на создание объекта Remote типа object_reference. В строке 8 этот объект используется для получения ссылки на удаленный объект с помощью следующего вызова м етода:Remote.obj ectReference;
После этого программа-потребитель получает доступ к удаленному объекту. Класс object_reference обеспечивает выполнение некоторых необходимых действий и тем самым упрощает написание программы-потребителя. Ко н структор класса object_reference (о н вызывается в строке 6 программы 8.4) реализован следующим образом.
object_reference::object_reference(char *Service,
CORBA::ORB_var Orb)
{
NameService = Orb->resolve_initial_references (Service); NameContext = CosNaming::NamingContext::_narrow (
NameService);
}
Этот ко н структор получает ссылку на службу и м ен и создает объект к л асса NameContext. В строке 7 и м я это г о объекта передается м етолу objectName . Затем для получения объектной ссылки, связанной с именем объекта, используется именной контекст. Метод objectName реализован с л едую щ и м образо м.
void object_reference::objectName(char *OName) {
Name.length (1);
Name[0].id = CORBA::string_dup (OName); Name[0].kind = CORBA::string_dup ("");
try {
ObjectReference = NameContext->resolve (Name);
} catch(...) {
cerr « " Problem resolving Name " « endl; throw;
}
}
После вызова метода objectName программа-потребитель получает доступ кссылке на удаленный объект. Теперь остается лишь вызвать метод objectReference (это реализуется в строкев программы8.4). В методе objectName основную часть работы выполняет функция resolve . Программы 8.3 и 8.4 образуют простое распределенное приложение «клиент-сервер», которое для доступа к объектным ссылкам вместо строковой формы IOR-ссылок использует службу имен. В сетях intranet или Internet можно использовать оба подхода. Эти же варианты применяются в качестве опорных структурных компонентов в контексте новой модели Web-служб.
Подробнее об объектных адаптерах
Помимо службы имен и объекта именованного контекста, сервер в программе 8.3 также использует переносимый объектный адаптер. Вспомните, что адаптер (см. рис. 8.6) действует как своего рода посредник между ORB-брокером и обслуживающим объектом, который в действительности выполняет работу CORBA-объекта. Мы можем сравнить этот обслуживающий объект с «наемным» писателем, который пишет книту от имени «подуставшей» знаменитости. С этой знаменитостью наперебой общаются журналисты, литературные агенты и юристы. Знаменитость удостаивается всех почестей, но реальную работу делает за него другой человек. CORBA-объект «публикует» интерфейс с внешним миром и играет роль «знаменитости» в CORBA-программе. Программа-клиент (или потребитель) взаимодействует с интерфейсом, который обеспечивает CORBA-объект, но реальную работу выполняет обслуживающий объект, играя роль «наемного» писателя. Обслуживающий объект имеет собственный протокол, который может отличаться от используемого CORBA-объектом. CORBA-объект может предоставить С++-интерфейс для связи склиентом. Обслуживающий объект может быть реализован на Java, Smalltalk, Fortran и других языках программирования. Объектный адаптер обеспечивает интерфейс с обслуживающим объектом. Он адаптирует этот интерфейс, чтобы реализация обслуживающего объекта была прозрачна для ORB-брокера и программы-клиента. CORBA-реализация должна нормально поддерживать два типа объектных адаптеров: Basic Object Adapter (BOA) и Portable Object Adapter (POA). Сначала стандарт CORBA был ориентирован на использование ВОА-адаптера, но он не был достаточно гибким. Поэтому и был разработан РОА-адаптер, который нашел более широкое применение. ВОА-адаптер обладает минимальным набором средств, но его вполне можно использовать для активизации объектных реализаций на базе информации, которая содержится в хранилище реализаций (табл. 8.4).