Продолжается подписка на наши издания! Вы не забыли подписаться?

Интерсепторы CORBA**

Александр Цимбал

Интерсепторы (interceptors), по сути, являются callback-методами, зарегистрированными программистом в ORB. Эти методы автоматически вызываются ORB'ом при выполнении тех или иных действий.

Интерсепторы являются очень важной частью CORBA, хотя обычный, "прикладной" программист имеет дело с ними нечасто. Возможно, причиной является еще и то, что спецификация интерсепторов появилась в CORBA недавно. До этого интерсепторы использовались разработчиками реализаций CORBA, так сказать, в инициативном порядке. Спецификация интерсепторов в версиях 2.3 и 2.4 выглядит достаточно бледно. Только в CORBA 3 появилась подробная и хорошо продуманная спецификация (так называемые "Переносимые интерсепторы" – Portable Interceptors).

Для чего могут потребоваться интерсепторы? Для ответа на этот вопрос нужно сначала рассмотреть некоторые аспекты взаимодействия ORB, сервисов CORBA, клиентских и серверных приложений.

Элементы CORBA, используемые для выполнения удаленных вызовов

Для возможности обращения к удаленному объекту с помощью технологии CORBA прежде всего необходимо создать на стороне сервера CORBA-объект. За создание объекта отвечает объектный адаптер. В настоящий момент существует единственная современная спецификация объектного адаптера – POA (Portable Object Adapter). Прежде, чем приступить к созданию CORBA-объектов, нужно создать должным образом настроенный POA. Делается это с помощью набора опций или "политик" (policies). Настройки POA влияют на вид создаваемых CORBA-объектов.

Реальным результатом создания CORBA-объекта является создание объектной ссылки на этот объект. Объектная ссылка - это совокупность информации, которая нужна для получения доступа к нужному серверному объекту. Давайте рассмотрим структуру объектной ссылки CORBA. Для краткости мы будем говорить о формате объектной ссылки при использовании протокола GIOP 1.2. Под "объектной ссылкой" мы везде будем понимать объектную ссылку в формате IOR - Interoperable Object Reference. Воообще-то объектная ссылка в тех случаях, когда она не выходит за пределы одной реализации ORB, может существовать в различных форматах – так, как это удобно авторам данной реализации. Но если возникает потенциальная возможность передачи объектной ссылки другому ORB'у, объектная ссылка из "внутреннего" произвольного формата должна быть преобразована к формату IOR.

Объектная ссылка в формате IOR

Удобнее всего описать ссылку на языке IDL. Главной ее особенностью является то, что с помощью одной объектной ссылки можно получить доступ к серверному объекту с использованием различных транспортных протоколов, "поверх" которых реализован протокол GIOP. Естественно, параметры для различных транспортов должны быть различными (например, для TCP/IP естественно ожидать задания IP-адреса и номера порта, которые характеризуют серверное приложение). Совокупность параметров, характерных для того или иного транспортного протокола, называется "профилем" (profile). Объектная ссылка может содержать от одного до нескольких профилей.

module IOP 
{ // IDL
  typedef unsigned long ProfileId;
  struct TaggedProfile 
  {
    ProfileId tag;
    sequence <octet> profile_data;
  };

  // Interoperable Object Reference является последовательностью 
  // (sequence) профилей для различных протоколов; кроме того, она 
  // содержит строковый идентификатор типа (type ID) - Репозитарный
  // Идентификатор реализуемого интерфейса.
  struct IOR 
  {
    string type_id;
    sequence <TaggedProfile> profiles;
  };
  // В свою очередь, профиль может содержать несколько элементов 
  // (компонентов).
  typedef unsigned long ComponentId;
  struct TaggedComponent 
  {
    ComponentId tag;
    sequence <octet> component_data;
  };
  typedef sequence<TaggedComponent> TaggedComponentSeq;
};

Спецификация оговаривает некоторые стандартные значения тегов профилей (ProfileId) и компонентов (ComponentId), например...

<...>

Некоторые сообщения (messages) GIOP

Взаимодействие клиентов и серверов в CORBA осуществляется, естественно, с помощью отправки запросов в соответсвие с требованиями протокола GIOP. Протокол предусматривает восемь различных типов сообщений, основными из которых являются два: Request (посылка запроса) и Reply (ответ на него). Их мы рассмотрим ниже подробнее...

<...>

Для чего могут использоваться интерсепторы

Главное назначение интерсепторов – обеспечение возможность перехвата и обработки выполняемого с помощью ORB'а удаленного вызова в интересах того или иного сервиса CORBA (в том числе вашего собственного). Основные программные модели, для которых используются интерсепторы, оговорены в спецификации. Это:

Даже если вы не собираетесь создавать свой специфический сервис CORBA, изменять объектные ссылки, оговаривать, передавать и обрабатывать свои сервисные контексты, интерсепторы все же могут быть полезны, например, для:

Основные принципы использования интерсепторов

Виды интерсепторов

Спецификация Переносимых Интерсепторов оговаривает два вида интерсепторов: Request-интерсепторы и IOR-интерсепторы.

Request-интерсепторы служат для "вмешательства" в процесс передачи информации по ORB в интересах некоторого сервиса CORBA (стандартного или написанного вами). Это вмешательство необходимо для того, чтобы передавать специфическую для сервиса информацию (в виде IOP::ServiceContextList) между клиентами и серверами. Такие интерсепторы используются, например, сервисами Транзакций (OTS) и Безопасности CORBA. Клиент вызывает удаленный метод. Если вызов выполняется в контексте глобальной транзакции и/или с использованием системы обеспечения безопасности, то наряду с параметрами, заданными клиентом, нужно передать в виде контекста(ов) соответствующего сервиса дополнительную информацию – например, контекст текущей транзакции. Для этого необходимо перехватить клиентский запрос, чтобы добавить в заголовок GIOP-запроса соответствующую информацию. На стороне сервера нужно перехватить поступивший запрос (вместе с контекстом транзакции) и передать ее серверу (контексту сервера), чтобы обработчик запроса мог получить запрос к этому контексту транзакции – например, чтобы вызвать для него метод rollback_only.

IOR-интерсепторы предназначены, в первую очередь, для внесения необходимых для некоторого сервиса изменений в структуру объектных ссылок. Более конкретно, они работают с TaggedComponents – элементами профилей, описывающих те или иные аспекты организации взаимодействия, формализованные в виде данных, находящихся в самой объектной ссылке. Для работы с IOR-интерсепторами необходимо очень глубокое понимание деталей "внутренней" механики CORBA.

Request-интерсепторы

Существуют два вида request-интерсепторов – на стороне клиента и на стороне сервера.

Для каждого из видов определены так называемые "точки срабатывания" – этапы выполнения удаленных запросов, на которых происходит вызов ORB'ом зарегистрированных интерсепторов. Точки срабатывания делятся на три группы:

Для request-интерсепторов определено по 5 точек срабатывания на стороне сервера и клиента (рисунок 1)

Рисунок 1.

Рассмотрим сначала точки срабатывания для клиента...

<...>

ORB на стороне сервера вызывает зарегистрированные IOR-интерсепторы в трех случаях:

<...>

Основные интерфейсы и методы

В этом разделе будут рассмотрены основные интерфейсы спецификации Переносимых интерсепторов...

<...>

Заключение

Спецификация переносимых интерсепторов позволяет контролировать процессы, протекающие на уровне ORB при выполнении удаленных вызовов, а также создавать свои собственные сервисы. Регистрация request-интерсепторов как на стороне клиента, так и на стороне сервера может быть выполнена так, что не требуется вносить никаких изменений в код клиентских или серверных приложений.


Copyright © 1994-2016 ООО "К-Пресс"