
Архитектура Common Object Request Broker разрабатывает и реализует распределенные объектно-ориентированные системы (CORBA). 800 глобальных организаций присоединились к группе управления объектами для создания CORBA (OMG). OMG была основана в 1989 году для продвижения масштабируемых, многоразовых и более дешевых компьютерных систем, использующих открытые стандарты. Любой может просмотреть характеристики OMG.
Посредник запросов объектов
Брокер запросов объектов обрабатывает взаимодействие клиент-объект (ORB). Реализация объекта клиента может быть на том же или отдельном хосте. ORB находит готовый процесс реализации объекта для удовлетворения запросов. Реализации клиента и объекта могут использовать отдельные аппаратные средства, ОС и языки. OMG определяет стандартные языковые привязки COBOL.
Архитектура управления объектами
CORBA определяет OMA как архитектуру интеграции программных компонентов (OMA). Благодаря своей базе ORB OMA может выполнять рассредоточенные прикладные задачи.
Банковское дело, здравоохранение и телекоммуникации имеют определенные услуги и возможности. OMG и ее участники определяют CORBAservices и CORBAfacilities, а поставщики реализуют их. Услуги и Средства нескольких поставщиков могут обмениваться данными. Немногие приложения CORBA используют многие из ее сервисов и функций.
Курс разработки Java для Android даст вам больше информации по теме.
Язык определения интерфейса
IDL описывает контракт клиент-сервер (IDL). IDL определяет интерфейс и параметры работы. IDL не зависит от языков клиент/сервер. Синтаксис IDL подобен синтаксису Java или C++. Однако IDL не содержит деталей реализации, поскольку интерфейсы IDL реализуются на обычных языках программирования.
Интерфейсы IDL для нашего примера следующие:
интерфейс гостевой комнаты; // предварительное объявление
интерфейс Отель {
имя строки атрибута только для чтения;
атрибут только для чтения short numberOfRooms;
Регистрация в гостевой комнате (кратко numNights);
};
интерфейс гостевой комнаты {
короткий атрибут только для чтения roomNumber;
плавающая скорость атрибута только для чтения;
атрибут только для чтения short numNights;
аннулировать плату за еду (в плавающей сумме);
баланс плавающего атрибута только для чтения;
аннулировать проверку();
};
В этом примере есть два интерфейса: Hotel и GuestRoom.
При заселении в гостиницу гость получает GuestRoom. После регистрации гость может оплатить питание, проверить баланс номера и уйти. Компилятор IDL создает код-заглушку клиента и скелетный код сервера на целевом языке из кода IDL.
Код-заглушка скрывает клиента от удаленной специфики работы. Скелетный код скрывает сервер от низкоуровневых сложностей, связанных с обеспечением доступа к объекту реализации на стороне клиента.
Наш компилятор IDL генерирует Java. Если бы клиент и сервер были написаны на разных языках, мы бы скомпилировали код IDL для каждого языка.
Большинство компиляторов IDL позволяют программисту сохранять полученный код Java в пакете Java. Каждый компилятор IDL работает по-своему. JacORB с открытым исходным кодом является примером. «-p» указывает пакет для компилятора JacORB IDL. Весь созданный код Java входит в пакет com.ociweb.
java org.jacorb.idl.parser -p com.ociweb Hotel.idl
Клиенты и серверы
Мы создадим клиент и сервер, используя API отеля и гостевой комнаты.
Сначала клиент получает ссылку на объект отеля. Клиент использует ссылку на объект для запуска действий объекта сервера. Клиент и сервер передают и получают ссылки на объекты с помощью службы именования CORBA.
Служба именования связывает удобочитаемые имена со ссылками на объекты. Некоторые объекты сервера привязаны к службе именования. Наш сервер регистрирует свой отель, но не свою гостевую комнату в службе именования.
Функция checkIn() возвращает GuestRoom.
Клиент
Клиент должен найти удаленные объекты и вызвать действия с ними. Клиент использует службу именования, чтобы определить местонахождение отеля и гостевого номера. Он использует Hotel и GuestRoom как локальные ссылки на Java.
импортировать org.omg.CosNaming.*;
импортный отель;
импортировать HotelHelper;
импортировать гостевую комнату;
открытый класс HotelClient {
public static void main(String[] args) {
пытаться {
// Инициализируем ШАР.
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
// Получаем корневой контекст именования службы именования
org.omg.CORBA.Object obj =
orb.resolve_initial_references("NameService");
NamingContextExt rootContext = NamingContextExtHelper.narrow(obj);
// Получить ссылку на объект отеля из службы именования
obj = rootContext.resolve_str("Отели/Отель Калифорния");
Отель theHotel = HotelHelper.narrow(obj);
если (отель == ноль) {
Система.ошибка.println(
«ОШИБКА: ссылка на объект не относится к отелю»);
Система.выход(1);
}
// Вызовите операции над отелем, как если бы это был локальный объект.
// Обратите внимание, что доступ к атрибуту «name» осуществляется через метод «name()»
Строка hotelName = theHotel.name();
System.out.println("Это отель " + hotelName);
// Заселение в номер на 5 ночей.
короткое количество ночей = 5;
Комната для гостей = theHotel.checkIn(numNights);
System.out.println("Остаток на кассе за номер"
+ room.roomNumber() + “ будет: “ + room.balance() );
} catch (org.omg.CORBA.SystemException ex) { // Перехват исключений
System.err.println("ОШИБКА: " + ex);
ex.printStackTrace(System.err);
} поймать (org.omg.CORBA.UserException ex) {
System.err.println("ОШИБКА: " + ex);
ex.printStackTrace(System.err);
}
}
}
Java: полный курс Java-разработчика расширит ваши знания и навыки.
Сервер
Сервер реализует клиентские IDL-интерфейсы.
Hotel и GuestRoom являются серверными интерфейсами.
Пишем класс реализации Hotel. Класс-слуга расширяет класс HotelPOA компилятора IDL и реализует его атрибуты, операции и другую информацию.
Скелетный класс IDL — HotelPOA.
импортный отель;
импортировать HotelHelper;
импортировать HotelPOA;
импортировать гостевую комнату;
импортировать GuestRoomHelper;
импортировать GuestRoomImpl;
импортировать org.omg.PortableServer.POA;
импортировать org.omg.PortableServer.POAPackage.*;
открытый класс HotelImpl расширяет HotelPOA {
частный статический окончательный int NUMBER_OF_ROOMS = 500;
private GuestRoomImpl[] комнаты = new GuestRoomImpl[NUMBER_OF_ROOMS];
частное логическое значение [] доступно = новое логическое значение [NUMBER_OF_ROOMS];
частный POA guestRoomPOA;
public HotelImpl(POA guestRoomPOA) {
this.guestRoomPOA = гостевая комнатаPOA;
for (int i = 0; i ‹ available.length; ++i) {
доступно[я] = правда;
} // конец for ()
}
общедоступное имя строки () {
вернуть «Отель Калифорния»;
}
публичный короткий номерOfRooms () {
вернуть NUMBER_OF_ROOMS;
}
общедоступная регистрация в гостевой комнате (короткое число ночей) {
// Определяем, свободна ли комната.
Доступная комната для гостейRoom = null;
короткий nextRoom = 0;
в то время как (следующая комната ‹ NUMBER_OF_ROOMS && !доступно[следующая комната]) {
++следующая комната;
} // конец пока()
если (следующая комната ‹ NUMBER_OF_ROOMS) {
доступный [следующая комната] = ложь;
если (комнаты[nextRoom] == ноль) {
комнаты [следующая комната] = новая гостевая комната (следующая комната);
} // конец если ()
комнаты[nextRoom].checkIn(numNights);
пытаться {
availableRoom = GuestRoomHelper.narrow(
this.guestRoomPOA.servant_to_reference(rooms[nextRoom]));
} поймать (ServantNotActive ex) {
// Не будет выброшено в этом приложении
System.err.println("ОШИБКА: " + ex);
ex.printStackTrace(System.err);
вернуть ноль;
} поймать (WrongPolicy ex) {
// Не будет выброшено в этом приложении
System.err.println("ОШИБКА: " + ex);
ex.printStackTrace(System.err);
вернуть ноль;
}
} // конец еще
вернуть доступную комнату;
}
}
А вот класс слуги для GuestRoom:
импортировать гостевую комнату;
импортировать GuestRoomHelper;
импортировать GuestRoomImpl;
импортировать org.omg.PortableServer.POA;
открытый класс GuestRoomImpl расширяет GuestRoomPOA {
частное логическое значение checkedIn = false;
частный короткий номер;
частная плавающая ставка = 100,0f;
приватный короткий numNights;
частный плавающий баланс = 0,0f;
GuestRoomImpl (короткий номер комнаты) {
this.номер_комнаты = номер_комнаты;
}
public void checkIn(short numNights) {
this.checkedIn = истина;
this.numNights = количество ночей;
this.balance = this.numNights * this.rate;
}
общедоступный короткий roomNumber () {
вернуть this.roomNumber;
}
общедоступная плавающая ставка () {
вернуть этот.рейт;
}
публичный короткий numNights () {
вернуть это.numNights;
}
публичный плавающий баланс () {
вернуть этот баланс;
}
public void chargeMeal(плавающая сумма) {
this.balance += сумма;
}
public void checkOut() {
this.checkedIn = ложь;
это.numNights = 0;
это.баланс = 0.0f;
}
}
Затем нашему серверу нужна основная программа.
Основная программа инициализирует ORB, создает сервант отеля, регистрирует сервант отеля с помощью адаптера объекта и привязывает отель к службе именования:
импортный отель;
импортировать HotelHelper;
импортировать org.omg.CORBA.*;
импортировать org.omg.PortableServer.*;
импортировать org.omg.CosNaming.*;
импортировать org.omg.CosNaming.NamingContextPackage.*;
открытый класс HotelServer {
public static void main(String args[]) {
пытаться {
// создаем и инициализируем ORB и POA
ORB orb = ORB.init(args, null);
POA poa = org.omg.PortableServer.POAHelper.narrow(
orb.resolve_initial_references("RootPOA"));
// создаем сервант и регистрируем его в POA
Слуга HotelImpl = новый HotelImpl(poa);
byte[] hotelId = poa.activate_object(servant);
// Получаем корневой контекст именования службы именования
org.omg.CORBA.Object obj =
orb.resolve_initial_references("NameService");
NamingContextExt rootContext =
NamingContextExtHelper.narrow(obj);
// Создаем контекст именования «Отели»
пытаться {
rootContext.bind_new_context(
rootContext.to_name("Отели"));
} поймать (уже связан) {
// потребляем исключение
}
// Публикация ссылки на объект отеля в службе именования
org.omg.CORBA.Object hotelObj =
poa.id_to_reference (идентификатор отеля);
rootContext.rebind(rootContext.to_name(
«Отели/Отель Калифорния»), hotelObj);
// активируем RootPOA и запускаем
poa.the_POAManager().activate();
orb.run();
} поймать (org.omg.CORBA.SystemException ex) {
System.err.println("ОШИБКА: " + ex);
ex.printStackTrace(System.err);
} поймать (org.omg.CORBA.UserException ex) {
System.err.println("ОШИБКА: " + ex);
ex.printStackTrace(System.err);
}
}
}
Несколько известных институтов предлагают полный курс для разработчиков Android и Java.