Простий CORBA додаток - своїми руками. Технологія CORBA (Common Object Request Broker Architecture)

Ознайомитись з теоретичним матеріалом, представленим у додатках до даних методичних вказівок та прикладів програм. Ознайомитись з текстом завдання до лабораторної роботи, запропонувати розміщення компонентів та функціональність, що задовольняє вимогам завдання до лабораторної роботи, та написати програму.

2. Завдання до лабораторної роботи

Розробити поштовий клієнтта сервер. Клієнт – віконний додаток, яке дозволятиме відсилати та отримувати з сервера повідомлення. Ідентифікація клієнтів на сервері, протокол передачі повідомлень – на розсуд студентів.

Сервер може бути консольним додатком. Зберігати повідомлення можна у текстовому файлі. Рекомендується зробити сервер багатопоточним.

Для взаємодії клієнта та сервера використовувати технологію CORBA.

Як доповнення пропонується сервер або клієнт реалізувати не на Java.

3. Зміст звіту

Звіт повинен містити:

1. Постановку завдання, яке вирішується налагодженою програмою.

2. Посібник користувача налагодженої програми, що містить опис інтерфейсів усіх функцій програми.

3. Лістинг програми із необхідними коментарями.

4. Контрольні питання

1. Що таке CORBA?

2. Що таке IDL? Навіщо він потрібний?

3. Як здійснюється взаємодія клієнта та сервера в CORBA?

4. Як передаються дані з-поміж них?

5. Навіщо потрібен сервер імен?

6. Як запускається CORBA-сервер?

5. Література

1. Кен Арнольд, Джеймс Гослінг, Девід Холмс. Мова програмування Java™.

2. Офіційний сайт Java – http://java.sun.com/ (є розділ російською мовою з підручником).

3. Java™ 2 SDK, Standard Edition Documentation - http://java.sun.com/products/jdk/1.5/index.html.

4. Джеймс Гослінг, Білл Джой, Гай Стіл. Специфікація мови Java(The Java Language Specification – http://www.javasoft.com/docs/books/jls/). Переклад російською мовою – http://www.uni-vologda.ac.ru/java/jls/index.html

5. Офіційний сайт проекту Eclipse – http://www.eclipse.org/.

6. Додаток 1. CORBA

Технологія CORBA(Common Object Request Broker Architecture) – це стандарт написання розподілених додатків, запропонований консорціумом OMG (Open Management Group). Створюючи CORBA‑об'єкти, ми можемо, наприклад, істотно зменшити час розв'язання завдань, які потребують великого обсягу обчислень. Це можливо завдяки розміщенню об'єктів CORBA на різних машинах. Кожен віддалений об'єкт вирішує певне підзавдання, цим розвантажує клієнт від зайвої роботи.

Основу CORBA складає об'єктний брокер запитів (Object Request Broker). ORB управляє взаємодією об'єктів у розподіленому мережному середовищі. IIOP (Internet Inter-ORB Protocol) – це особливий протокол взаємодії між ORB.

В адресному просторі клієнта функціонує спеціальний об'єкт, що називається заглушкою (stub). Повчивши запит від клієнта, він пакує параметри запиту у спеціальний формат і передає його серверу, а точніше скелету.

Скелет (skeleton) – об'єкт, працюючий у адресному просторі сервера. Отримавши запит від клієнта, він розпаковує його та передає серверу. Також скелет перетворює відповіді сервера та передає їх клієнту (заглушці).

Для того щоб написати будь-який додаток CORBA використовуючи технологію Java, необхідно мати дві речі – це встановлений пакет JDK1.5 та компілятор idlj (…\jdk1.5.0\bin\idlj.exe). JDK надає набір класів для роботи з CORBA об'єктами, а idlj відображає мову IDL в Java.

6.1 Створення найпростішого CORBA-додатку

6.1.1 Написання інтерфейсу

Створення CORBA програми Java починається з написання інтерфейсу для віддаленого об'єкта, використовуючи мову опису інтерфейсів (Interface Definition Language, IDL).

Створимо файл hello.idl

Module HelloApp(interface Hello(string sayHello();oneway void shutdown();););

Цей інтерфейс описує лише два методи shutdown і sayHello. Причому нам не важливо, що роблять ці методи, головне ми визначаємо, що вони є і визначаємо які в них вхідні та вихідні параметри.

idlj – fall Hello.idl

У поточній директорії з'явилася Нова папка Hello App, яка містить шість java-файлів. Кожен із них має своє призначення.

· HelloPOA.java java - абстрактний клас, який являє собою ні що інше, як скелет сервера (skeleton) і забезпечує функціональність сервера.

· _HelloStub.java - клас, що реалізує заглушку (stub) клієнта. Забезпечує функціональність клієнта.

· HelloHelper.java та HelloHolder.java – класи, що надають допоміжні функціїдля CORBA об'єктів.

· HelloOperations.java - клас, що містить опис інтерфейсу hello на мові Java.

· Hello.java – клас – спадкоємець HelloOperations, який підтримує інтерфейс org.omg.CORBA. Object.

6.1.2 Створення сервера

Тепер наше завдання – написати клас, що реалізує інтерфейс hello. У нашому випадку це буде HelloImpl. Зверніть увагу на те, що він є спадкоємцем класу HelloPOA. У HelloImplреалізовані методи, оголошені в Hello . idl .

Для спрощення завдання оголошення методів можна взяти з файлу HelloOperations . java , згенерованого jdlj .

Class HelloImpl extends HelloPOA (private ORB orb; public void setORB (ORB orb_val) (orb = orb_val;) // implement sayHello() methodpublic String sayHello() (return "\nHello world!!\n";) // implement shutdown() methodpublic void shutdown() (orb .shutdown(false);))

Наступним кроком буде створення власне серверної частини програми. Це буде клас HelloServer.

У ньому буде лише один метод – стандартна функція main.

Перше, що ми робимо, створюємо ORB. Потім створюємо екземпляр класу віддаленого об'єкта (HelloImpl) та реєструємо його в ORB. Далі викликаємо спеціальну службуімен (NameService) та реєструємо в ній ім'я віддаленого об'єкта, щоб клієнт зміг його знайти.

Розглянемо докладніше ці етапи.

1. Створення та ініціалізація ORB. Виконується викликом статичного методу initкласу ORB

2. Створення екземпляра класу віддаленого об'єкта та реєстрація його в ORB

helloImpl.setORB(orb);

3. Отримання контексту імен (NamingContext)

org.omg.CORBA. Object objRef = orb.resolve_initial_references («NameService»);

У першому рядку ми отримуємо посилання на службу імен (NameService). Але фактично це звичайний CORBA‑об'єкт і для того, щоб використовувати його як контекст імен (NamingContext), необхідно викликати метод narrowкласу NamingContextHelper, який конкретизує даний CORBA-об'єкт.

4. Реєстрація імені віддаленого об'єкта (HelloImpl)

String name = Hello;

ncRef.rebind (path, href);

Реєстрація імені здійснюється для того, щоб клієнт зміг знайти віддалений об'єкт. Цій меті служить функція rebind (NameComponent nc, Object obj) інтерфейсу NamingContext.

5. Очікування запитів від клієнта

Тепер сервер готовий працювати.

// HelloServer.javaimport HelloApp.*;import org.omg. CosNaming.*;import org.omg. CosNaming. NamingContextPackage.*;import org.omg.CORBA.*;import org.omg. PortableServer.*;import org.omg. PortableServer.POA;import java.util. Properties;class HelloImpl extends HelloPOA (private ORB orb;public void setORB (ORB orb_val) (orb = orb_val;) // implement sayHello() methodpublic String sayHello() (return «\nHello world!!\n»;) // implement shutdown() methodpublic void shutdown() (orb.shutdown(false);))

public class HelloServer (

public static void main (String args) (

// create and initialize the ORB

ORB orb = ORB.init (args, null);

// get reference to rootpoa & activate the POAManager

POA rootpoa = POAHelper.narrow (orb.resolve_initial_references («RootPOA»));

rootpoa.the_POAManager().activate();

// create servant and register it with the ORB

HelloImpl helloImpl = New HelloImpl();

helloImpl.setORB(orb);

// get object reference from the servant

org.omg.CORBA. Object ref = rootpoa.servant_to_reference(helloImpl);

Hello href = HelloHelper.narrow(ref);

// get the root naming context

// NameService invokes the name service

org.omg.CORBA. Object objRef =

orb.resolve_initial_references («NameService»);

// Use NamingContextExt which is part of the Interoperable

// Naming Service (INS) specification.

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// bind the Object Reference in Naming

String name = Hello;

NameComponent path = ncRef.to_name(name);

ncRef.rebind (path, href);

System.out.println («HelloServer ready and waiting…»);

// wait for invocations from clients

catch (Exception e) (

System.err.println ("ERROR:" + e);

e.printStackTrace (System.out);

System.out.println («HelloServer Exiting…»);

6.1.3 Створення клієнта

Перейдемо до написання коду клієнта.

Основні кроки написання клієнтської програми

1. Створення та ініціалізація ORB

2. Отримання контексту служби імен (NamingContext)

3. Знаходження віддаленого об'єкта

4. Виклик методу sayHello.

5. Виклик методу shutdown.

Як видно, перші два пункти збігаються з етапами створення серверної програми, тому розглядати їх не будемо.

Третій пункт реалізується також досить просто. Створюється об'єкт NameComponent. Викликається спосіб resolve (NameComponent path), який шукає на ім'я віддалений об'єкт (стандартний CORBA-об'єкт). За допомогою методу narrow (org.omg.CORBA. Object obj) класу helloHelper (згенерованого idlj компілятором) отримуємо об'єктне посилання на інтерфейс hello.

String name = Hello;

helloImpl = HelloHelper.narrow (ncRef.resolve_str(name));

Я знаю, що CORBA дозволяє реалізувати кілька об'єктів на різних мовахпрограмування і навіть працювати на різних обчислювальних вузлах. Однак, чи потрібні тоді дві різні ORB, написані двома різними мовами?

Приклад: Вузол A запускає програма Java J1, а вузол B запускає програму C++ C1. Чи повинен я отримати "Java ORB" для вузла A і "C++ ORB" для вузла B або всі/деякі ORB взаємодіють з програмами, написаними будь-якою мовою, якою є зіставлення IDL?

Я був би дуже вдячний, якби хтось міг зв'язати мене з джерелом, прямо виклавши це, як я хотів би його привести. Найближче, що я знайшов, це спосіб, яким програміст маніпулює структурою або об'єднанням, робить віддалений виклик з використанням проксі або реалізує інтерфейс з класом servant, так само у всіх продуктах CORBA C++, так само у всіх Java CORBA і т.д. д. ". Це змушує мене думати, що мені знадобляться два ORB, але недостатньо очевидні. В основному я хотів би знати, чи можу я сказати, що "оскільки ORB написано в C++, програмістам додатків також заборонено використовувати C++".

завдяки

3 відповідей

Не важливо, якою мовою ORB реалізований, важливо, які мовні прив'язки він надає. Для мови L вам потрібен орб, який надає прив'язки для мови L. Часто орби просто надають прив'язку до мови, якою вони самі написані, але також можуть забезпечувати прив'язки для деяких інших мов.

Ні. Пункт CORBA у тому, що він повністю відокремлює компоненти.

Очевидно, що ваші програми повинні використовувати клієнтські бібліотеки, з якими вони можуть взаємодіяти. Ваш ORB може встановлювати прив'язки тільки для однієї мови, і в цьому випадку вам потрібно знайти інші прив'язки або знайти спосіб взаємодії з ними (наприклад, якщо ви використовуєте Python, ви можете працювати з бібліотеками C++, якщо хочете).

Спробуйте використати цю технологію.

Існує кілька підходів, які можна використовувати при реалізації додатків CORBA, але підсумовуючи їх, так, інфраструктура ORB повинна бути тією ж мовою, що й ваша реалізація програми.

Як Java, так і C++ компілятор IDL генерує заглушки і скелети, які служать клеєм між мережею і вашою програмою. Ви надаєте реалізацію своїх об'єктів CORBA, які зазвичай успадковуються від генерованого компілятором IDL класу (скелета). Скелет якось отримує запит від клієнта, а потім викликає вашу реалізацію. Те саме відбувається у зворотному напрямку на стороні клієнта.

Потім і скелет, і заглушка використовують механізми, що надаються ORB, щоб віддалено викликати сервери та відповідати на відповіді назад, навіть включаючи встановлення мережевих підключень, якщо клієнт та сервери знаходяться на різних машинах. Ця "магія" реалізується ORB і повинна бути присутня у вашій програмі у вигляді бібліотеки, набору функцій і т.д., які заглушка і скелет будуть використовувати для виконання роботи.

Таким чином, кожна програма повинна мати якесь уявлення ORB для взаємодії з іншими клієнтами та серверами CORBA на інших машинах.

Однак з логічного погляду ORB розглядається як шар, який фактично і без проблем з'єднує як клієнтів, так і сервери, тому навіть якщо додаток C++ має деяку реалізацію ORB, написану в C++, і реалізацію Java мати ORB, написаний на Java, за допомогою магії стандартних протоколів(GIOP, IIOP), можуть спілкуватися друг з одним без проблем.


Звіт повинен містити:

    Постановку завдання, яке вирішується налагодженою програмою.

    Посібник користувача налагодженої програми, що містить опис інтерфейсів усіх функцій програми.

    Лістинг програми із необхідними коментарями.

  1. Контрольні питання

          Що таке CORBA?

          Що таке IDL? Навіщо він потрібний?

          Як здійснюється взаємодія клієнта та сервера вCORBA?

          Як передаються дані між ними?

          Навіщо потрібен сервер імен?

          Як запускається CORBAсервер?

  1. Література

    Кен Арнольд, Джеймс Гослінг, Девід Холмс.Мова програмування Java™.

    Офіційний сайтJavahttp:// java. sun. com/ (Є розділ російською мовою з підручником).

    Java™ 2 SDK, Standard Edition Documentation – http://java.sun.com/products/jdk/1.5/index.html.

    Джеймс Гослінг, Білл Джой, Гай Стіл.Специфікація мови Java ( The Java Language Specification http :// www . javasoft . com / docs / books / jls /). Переклад російською -http:// www. uni- vologda. ac. ru/ java/ jls/ index. html

    Офіційний сайт проектуEclipsehttp:// www. eclipse. org/.

  1. Додаток 1. CORBA

Технологія CORBA (CommonObjectRequestBrokerАрхітектура) – це стандарт написання розподілених додатків, запропонований консорціумомOMG (OpenManagementGroup). Створюючи CORBAоб'єкти, ми можемо, наприклад, суттєво зменшити час розв'язання завдань, які вимагають виконання великого обсягу обчислень. Це можливо завдяки розміщенню CORBA об'єктів на різних машинах. Кожен віддалений об'єкт вирішує певне підзавдання, цим розвантажує клієнт від зайвої роботи.

Основу CORBA складає об'єктний брокер запитів (Object Request Broker). ORB управляє взаємодією об'єктів у розподіленому мережному середовищі. IIOP (Internet Inter-ORB Protocol) – це особливий протокол взаємодії між ORB.

В адресному просторі клієнта функціонує спеціальний об'єкт, що називається заглушкою (stub). Повчивши запит від клієнта, він пакує параметри запиту у спеціальний формат і передає його серверу, а точніше скелету.

Скелет (skeleton) – об'єкт, працюючий у адресному просторі сервера. Отримавши запит від клієнта, він розпаковує його та передає серверу. Також скелет перетворює відповіді сервера та передає їх клієнту (заглушці).

Для того щоб написати будь-яку програму CORBA використовуючи технологію Java, необхідно мати дві речі – це встановлений пакет JDK1.5 та компілятор idlj (…\ jdk 1.5.0\ bin\ idlj. exe). JDK надає набір класів для роботи з CORBA об'єктами, а idlj відображає мову IDL в Java.

6 .1 Створення найпростішого CORBA-додатку

      1. Написання інтерфейсу

створення CORBAпрограми на Javaпочинається з написання інтерфейсу для віддаленого об'єкта, використовуючи мову опису інтерфейсів (InterfaceDefinitionLanguage, IDL).

Створимофайлhello.idl

module HelloApp

interface Hello

string sayHello();

oneway void shutdown();

Цей інтерфейс описує лише два методиshutdownі sayHello . Причому нам не важливо, що роблять ці методи, головне ми визначаємо, що вони є і визначаємо які в них вхідні та вихідні параметри.

Далі слід запустити компіляторIDL- to- Javaidlj:

idlj – fallHello. idl

У поточній директорії з'явилася нова папкаHello App , в якій міститься шість javaфайлів. Кожен із них має своє призначення.

    HelloPOA. javajava– абстрактний клас, який є нічим іншим, як скелет сервера (skeleton) та забезпечує функціональність сервера.

    _ HelloStub. java- Клас, що реалізуєзаглушку ( stub) клієнта. Забезпечуєфункціональність клієнта.

    HelloHelper. javaі HelloHolder. java– класи, що надають допоміжні функції дляCORBAоб'єктів.

    HelloOperations. java– клас, що містить опис інтерфейсуhelloмовою Java.

    Hello. java– клас – спадкоємецьHelloOperations, що підтримує інтерфейсorg. omg. CORBA. Object.

      1. Створення сервера

Тепер наше завдання – написати клас, що реалізує інтерфейсhello . У нашому випадку це будеHelloImpl . Зверніть увагу на те, що він є спадкоємцем класуHelloPOA . У HelloImpl реалізовані методи, оголошені вHello . idl .

Для спрощення завдання оголошення методів можна взяти з файлу HelloOperations . java , згенерованого jdlj .

private ORB orb;

orb = orb_val;

public String sayHello() (

return "\nHello world!!\n";

public void shutdown() (

orb.shutdown(false);

Наступним кроком буде створення власнесерверної частини програми. Це буде класHelloServer.

У ньому буде лише один метод – стандартна функціяmain.

Перше, що ми робимо, створюємо ORB. Потім створюємо екземпляр класу віддаленого об'єкта (HelloImpl) та реєструємо його в ORB. Далі викликаємо спеціальну службу імен (NameService) та реєструємо в ній ім'я віддаленого об'єкта, щоб клієнт зміг його знайти.

Розглянемо докладніше ці етапи.

1. Створення та ініціалізація ORB. Виконується викликом статичного методуinitкласу ORB

2. Створення екземпляра класу віддаленого об'єкта та реєстрація його в ORB

helloImpl.setORB(orb);

3. Отримання контексту імен (NamingContext)

org.omg.CORBA. Object objRef =

У першому рядку ми отримуємо посилання на службу імен (NameService). Але фактично це звичайний CORBAоб'єкт і для того, щоб використовувати його як контекст імен (NamingContext), необхідно викликати методnarrowкласу NamingContextHelper , який як би конкретизує цей CORBAоб'єкт.

4. Реєстрація імені віддаленого об'єкта (HelloImpl)

String name = Hello;

ncRef. rebind (path, href);

Реєстрація імені здійснюється для того, щоб клієнт зміг знайти віддалений об'єкт. Цій меті служить функціяrebind (NameComponentnc, Objectobj) інтерфейсу NamingContext.

5. Очікування запитів від клієнта

orb. run();

Тепер сервер готовий працювати.

// HelloServer.java

import HelloApp.*;

import org.omg. CosNaming.*;

import org.omg.CORBA.*;

import org.omg. PortableServer.*;

import org.omg. PortableServer.POA;

import java.util. Properties;

class HelloImpl extends HelloPOA (

private ORB orb;

public void setORB (ORB orb_val) (

orb = orb_val;

// implement sayHello() method

public String sayHello() (

return "\nHello world!!\n";

// implement shutdown() method

public void shutdown() (

orb.shutdown(false);

public class HelloServer (

public static void main (String args) (

try (

ORB orb = ORB.init (args, null);

// get reference to rootpoa & activate the POAManager

POA rootpoa = POAHelper.narrow (orb.resolve_initial_references («RootPOA»));

rootpoa.the_POAManager().activate();

// create servant and register it with the ORB

HelloImpl helloImpl = New HelloImpl();

helloImpl.setORB(orb);

// get object reference from the servant

org.omg.CORBA. Object ref = rootpoa.servant_to_reference(helloImpl);

Hello href = HelloHelper.narrow(ref);

// NameService invokes the name service

orb.resolve_initial_references («NameService»);

// Use NamingContextExt which is part of the Interoperable

// Naming Service (INS) specification.

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// bind the Object Reference in Naming

String name = Hello;

NameComponent path = ncRef.to_name(name);

ncRef.rebind (path, href);

System.out.println («HelloServer ready and waiting…»);

// wait for invocations from clients

orb.run();

catch (Exception e) (

System.err.println ("ERROR:" + e);

System.out.println («HelloServer Exiting…»);

      1. Створення клієнта

Перейдемо до написання коду клієнта.

Основні кроки написання клієнтської програми

    Створення та ініціалізація ORB

    Отримання контексту служби імен (NamingContext)

    Знаходження віддаленого об'єкту

    Виклик методу sayHello.

    Виклик методу shutdown.

Як видно, перші два пункти збігаються з етапами створення серверної програми, тому розглядати їх не будемо.

Третій пункт реалізується також досить просто. Створюється об'єктNameComponent. Викликається методresolve (NameComponentpath), який шукає на ім'я віддалений об'єкт (стандартнийCORBAоб'єкт). За допомогою методуnarrow (org. omg. CORBA. Objectobj) класу helloHelper(згенерованогоidljкомпілятором) отримуємо об'єктне посилання на інтерфейсhello.

String name = Hello;

Тепер можна викликати методsayHello:

Методshutdownзавершує роботу сервера.

helloImpl.shutdown();

//testClient.java

import HelloApp.*;

import org.omg. CosNaming.*;

import org.omg. CosNaming. NamingContextPackage.*;

import org.omg.CORBA.*;

public class HelloClient

{

static Hello helloImpl;

public static void main (String args)

{

try (

// create and initialize the ORB

ORB orb = ORB.init (args, null);

// get the root naming context

org.omg.CORBA. Object objRef =

orb.resolve_initial_references («NameService»);

// Use NamingContextExt instead of NamingContext. This is

// part of the Interoperable naming Service.

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// resolve the Object Reference in Naming

String name = Hello;

helloImpl = HelloHelper.narrow (ncRef.resolve_str(name));

System.out.println («Obtained a handle on server object:» + helloImpl);

System.out.println (helloImpl.sayHello());

helloImpl.shutdown();

) catch (Exception e) (

System.out.println ("ERROR:" + e);

e.printStackTrace (System.out);

}

}

}

      1. Компіляція і запуск програми

ФайлиHelloServer. java and HelloClient. java, Hello. idlта папкаHelloApp, створенаidkj. exeповинні зберігатися в одній папці.

Для компіляції клієнта та сервера треба в командному рядкунабрати

javac *.java HelloApp/*.java

javac. exeзнаходиться в …\jdk1.5.0\ bin.

СередаEclipseне дозволяє запускатиCORBAпрограми. Для запуску

1. Запустити службуorbdObject Request Broker Daemon (…\ jdk1.5.0\ bin\ orbd. exe). Це робиться, щоб ми змогли отримати посилання на службу імен.

start orbdORBInitialPort 1050

Параметр –ORBInitialPort– номер порту, на якому буде працювати сервер імен.

2. Запуск сервера

сервер імен.

3. Запуск клієнта

Вказується порт, у якому працює сервер імен. Параметр – ORBInitialHost вказує хост, на якому працюєсервер імен.

Для зручності компіляції та запуску можна створитиbatфайл:

idlj – fall Hello.idl

javac *.java HelloApp/*.java

start java HelloServer – ORBInitialPort 1050 – ORBInitialHost localhost

java HelloClient – ​​ORBInitialPort 1050 – ORBInitialHost localhost


6.2 Мова IDL

МоваOMG IDL (Interface Definition Language– Мова Опису Інтерфейсів) є технологічно незалежним синтаксисом для опису інтерфейсів об'єктів. При описі програмних архітектур,OMG IDLчудово використовується як універсальна нотація для визначення меж об'єкта, що визначають його поведінку по відношенню до інших компонентів інформаційної системи.OMG IDLдозволяє описувати інтерфейси, що мають різні методи та атрибути. Мова також підтримує успадкування інтерфейсів, що необхідно для повторного використанняоб'єктів з можливістю їхнього розширення чи конкретизації.

IDLє суто декларативною мовою, тобто вона не містить жодної реалізації.IDLспецифікації можуть бути відкомпільовані (відображені) у заголовні файли та спеціальні прототипи серверів, які можуть використовуватись безпосередньо програмістом. ТобтоIDLпевні методи можуть бути написані, а потім виконані, будь-якою мовою, для якої існує відображення зIDL. До таких мов належатьC, C++, SmallTalk, Pascal, Java, Ada.

За допомогоюIDLможна описати і атрибути компоненти, і батьківські класи які, вона успадковує, і виключення, що викликаються, і, нарешті, методи, що визначають інтерфейс, причому з описом вхідних і вихідних параметрів.

СтруктураCORBA IDLфайл виглядає так:

module (

;

;

;

interface [:] (

;

;

;

;

()

.

.

()

.

.

}

interface [:]

.

.

}

Синтаксис мовиIDLдосить об'ємний і неможливо описати їх у методичному посібнику.

Для реалізації інтерфейсу поштового сервера можна доповнитиHello. idl

module HelloApp

{

struct TMessage

{

string To;

string From;

string Message;

};

typedef sequence TMessages;

interface Hello

{

TMessages GetMessages (in string Name, out short count);

oneway void Send (in string Client, in string Name, in string Message);

string sayHello();

oneway void shutdown();

};

};

typedef sequence TMessages; оголошення типу динамічний масив повідомленьTMessage.

CORBA (Common Object Request Broker Architecture)- Об'єктно-орієнтована технологія створення розподілених додатків. Технологія заснована на використанні брокера об'єктних запитів (Object Request Broker, ORB)для прозорого відправлення та отримання об'єктами запитів у розподіленому оточенні. Технологія дозволяє будувати програми з розподілених об'єктів, реалізованих різними мовами програмування. Стандарт CORBAрозроблений Object Management Group (OMG).

Архітектура CORBA

У даному розділінаводиться короткий огляд CORBAу тому вигляді, як її опис дається у специфікації OMGВерсія 3.0. Вимоги цього документа можуть різною мірою задовольнятися фактичними реалізаціями брокерів об'єктних запитів. Рис. 2.1 зображено запит, що надсилається клієнтом реалізації об'єкта. Клієнт- це сутність, яка хоче виконати операцію з об'єктом, а Реалізація- це сукупність коду та даних, які насправді реалізують об'єкт.

ORBвідповідає за всі механізми, необхідні для пошуку підходящої для запиту реалізації об'єкта, підготовки реалізації до отримання запиту та передачі даних у процесівиконання запиту. Інтерфейс, видимий клієнту, зовсім незалежний від розташування реалізації об'єкта, мови програмування, якою вона написана і будь-яких інших аспектів, не відображених у специфікації інтерфейсу.

Динамічний інтерфейс виклику та інтерфейс заглушки має однакову семантику, так що одержувач повідомлення не може визначити, як було надіслано запит. ORBзнаходить відповідний код реалізації об'єкта, пересилає йому параметри та віддає управління через IDLскелетон чи динамічний скелетон (Рис. 2.4). Скелетони специфічні для конкретного інтерфейсу та об'єктного адаптера. Під час виконання запиту реалізація може скористатися деякими сервісами ORBчерез об'єктний адаптер. Коли запит виконано, керування та значення результату повертаються клієнту.

Реалізація об'єкта може вибрати, який об'єктний адаптер використовувати, залежно від того, яких сервісів вона потребує. Рис. 2.5 показано, як інформація про інтерфейс та реалізацію стає доступною клієнтам та реалізаціям об'єктів. Інтерфейси описуються на IDLабо за допомогою репозиторію інтерфейсів. Їх описи використовуються для генерації клієнтських заглушок та скелетонів для реалізації.

Інформація про реалізацію об'єкта надається під час інсталяції та зберігається в репозиторії реалізації, а потім використовується у процесі доставки запиту.

Олександр Годін

Технологія CORBA - це стандарт написання розподілених програм, запропонований консорціумом OMG (Open Management Group). Створюючи CORBA-об'єкти, ми можемо, наприклад, суттєво зменшити час розв'язання завдань, які потребують виконання великого обсягу обчислень. Це можливо завдяки розміщенню об'єктів CORBA на різних машинах. Кожен віддалений об'єкт вирішує певне підзавдання, цим розвантажує клієнт від зайвої роботи.

Розглянемо взаємодію об'єктів в архітектурі CORBA

Рис.1 Взаємодія об'єктів в архітектурі CORBA

Основу CORBA складає об'єктний брокер запитів (Object Request Broker). ORB управляє взаємодією об'єктів у розподіленому мережному середовищі. IIOP (Internet Inter-ORB Protocol) – це спеціальний протокол взаємодії між ORB.

В адресному просторі клієнта функціонує спеціальний об'єкт, що називається заглушкою (stub). Повчивши запит від клієнта, він пакує параметри запиту у спеціальний формат і передає його серверу, а точніше скелету.

Скелет (skeleton) – об'єкт, що працює в адресному просторі сервера. Отримавши запит від клієнта, він розпаковує його та передає серверу. Також скелет перетворює відповіді сервера та передає їх клієнту (заглушці).

Для того, щоб написати будь-яку програму CORBA використовуючи технологію Java, необхідно мати дві речі - це встановлений пакет JDK1.2 та компілятор idltojava. JDK надає набір класів для роботи з CORBA об'єктами, а idltojavaвідображає мову IDL в Java.

Створення CORBA програми Java починається з написання інтерфейсу для віддаленого об'єкта, використовуючи мову опису інтерфейсів (Interface Definition Language, IDL).

Створимо файл test.idl module testApp ( interface test ( long count(in string msg); ); );

Цей інтерфейс описує лише один метод count. Причому нам не важливо, що робить цей метод, головне ми визначаємо, що він є, визначаємо які в нього вхідні та вихідні параметри.

Скористаємося компілятором idltojava.

Idltojava Hello.idl Примітка. Цей компілятор за замовчуванням використовує препроцесор мови С++, тому що б не мучиться з повідомленням про помилку ім'я команди або файлу вказано неправильно(у змінній оточення CPP має бути прописаний шлях до нього) відключимо його використання, встановивши прапори. idltojava -fno-cpp Hello.idl Результат роботи цієї програми можна подати у вигляді схеми.

Рис.2 Робота idltojava компілятора
У поточній директорії з'явилася нова папка testApp, В якій містяться п'ять java - файлів. Кожен із них має своє призначення.

_testImplBase.java -абстрактний клас, який є не що інше, як скелет сервера (skeleton) і забезпечує функціональність сервера;

_testStub.java -клас, що реалізує заглушку клієнта. Забезпечує функціональність клієнта;

test.java -клас, що містить опис інтерфейсу test мовою Java;

testHelper.javaі testHolder.java -класи, що надають допоміжні функції для об'єктів CORBA.

Тепер наше завдання – написати клас, що реалізує інтерфейс test. Такі класи мають називатися так, щоб у їхньому імені було слово "Servant", у нашому випадку це буде testServant.

Class testServant extends _testImplBase ( public int count(String msg) ( return msg.length(); ) )

Зверніть увагу, що цей клас успадкований від _testImplBase. Як видно, тут реалізовано метод count, який у даному прикладівважає кількість літер у прийнятому повідомленні.

Тепер перейдемо безпосередньо до написання серверної частини програми.

Перше, що ми робимо, створюємо ORB. Потім створюємо екземпляр класу віддаленого об'єкта (testServant) та реєструємо його в ORB. Далі викликаємо спеціальну службу імен (NameService) і реєструємо в ній ім'я віддаленого об'єкта, щоб клієнт зміг його знайти (є й інший спосіб знаходження віддаленого об'єкта, але трохи пізніше).

Розглянемо докладніше ці етапи.

  1. Створення та ініціалізація ORB. Виконується викликом статичного методу initкласу ORB

    ORB orb = ORB.init();

  2. Створення екземпляра класу віддаленого об'єкта та реєстрація його в ORB

    testServant testRef = новий testServant();

    orb.connect(testRef);

  3. Отримання контексту імен (NamingContext)

    org.omg.CORBA.Object objRef =

    orb.resolve_initial_references("NameService");

    NamingContext ncRef = NamingContextHelper.narrow(objRef);

    у першому рядку ми отримуємо об'єкт посилання на службу імен (NameService). Але фактично це звичайний CORBA-об'єкт і для того, щоб використовувати його як контекст імен (NamingContext), необхідно викликати метод narrowкласу NamingContextHelper, який конкретизує даний CORBA-об'єкт.

  4. Реєстрація імені віддаленого об'єкта (testServant)

    Як було сказано раніше, реєстрація імені проводиться для того, щоб клієнт зміг знайти віддалений об'єкт. Цій меті служить функція rebind(NameComponent nc, Object obj)інтерфейсу NamingContext.

    NameComponent nc = new NameComponent("test", ""); //перший параметр //вказує ім'я об'єкта, //другий нам використовувати не обов'язково NameComponent path = (nc); ncRef.rebind(path, testRef);

  5. Очікування запитів від клієнта. java.lang.Object sync = new java.lang.Object(); synchronized (sync) ( sync.wait(); )

    Після того як сервер обробить запит від клієнта та виконає метод countвін знову перейде у стан очікування.

Тепер сервер готовий до роботи

Лістинг 1. testServer.java

Import testApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import java.lang.*; class testServant extends _testImplBase ( public int count(String msg) ( return msg.length(); ) ) public class testServer ( public static void main(String args) ( try ( ORB orb = ORB.init(args, null); testRef = новий testServant(); orb.connect(testRef); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); nameComponent path = (nc); ncRef.rebind(path, testRef); java.lang.Object sync = new catch (Exception e) ( System.err.println("ERROR: " + e); e.printStackTrace(System.out); ) ) )

Зверніть увагу на те, що всі операції, що виконуються над CORBA-об'єктами, укладені в try-catch блок.

Перейдемо до написання коду клієнта.

Основні кроки написання клієнтської програми

  1. Створення та ініціалізація ORB
  2. Отримання контексту служби імен ( NamingContext)
  3. Знаходження віддаленого об'єкту
  4. Виклик методу count.

Як видно, перші два пункти збігаються з етапами створення серверної програми, тому розглядати їх не будемо.

Третій пункт реалізується також досить просто. Створюється об'єкт NameComponent. Викликається метод resolve(NameComponent path), який шукає на ім'я віддалений об'єкт (стандартний CORBA-объект). За допомогою методу narrow(org.omg.CORBA.Object obj)класу testHelper(згенерованого idltojavaкомпілятором) отримуємо об'єктне посилання на інтерфейс test.

NameComponent nc = new NameComponent("test", ""); NameComponent path = (nc); org.omg.CORBA.Object obj = ncRef.resolve (path); test testRef = testHelper.narrow(obj);

Тепер можна викликати метод count

String msg="try to count"; int count = testRef.count(msg);

Лістинг 2. testClient.java

Import testApp.*; import org.omg.CosNaming.*; import org.omg.CORBA.*; import java.lang.*; public class testClient ( public static void main(String args) (try (ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = Naming narrow(objRef); NameComponent nc = new NameComponent("test", ""); NameComponent path = (nc); int count = testRef.count(msg); e.printStackTrace(System.out); ) ) )

Запуск програми

  1. Запуск сервера імен (входить у постачання з JDK1.2). Це робиться, щоб ми змогли отримати посилання на службу імен tnameserv

    за замовчуванням сервер запускається портом 900. Це значення можна змінити, вказавши параметр запуску -ORBInitialPort, наприклад

    Tnameserv -ORBInitialPort 1024

  2. Запуск сервера testServer java testServer -ORBInitialPort 1024 // вказується той порт // яким працює сервер імен
  3. Запуск клієнта testClient java testClient -ORBInitialHost javas.stu.neva.ru -ORBInitialPort 1024

    параметр -ORBInitialHost вказує хост, на якому працює testServer

після виконання цієї програми, на консоль буде виведено

Номер Chars in message is:12

З'єднання з сервером без використання служби імен

Основна ідея цього методу полягає в тому, що сервер зберігає екземпляр класу віддаленого об'єкта ( testServant) у вигляді текстового файлуу будь-якому місці, доступному клієнту. Клієнт завантажує з файлу дані (об'єкт String) і перетворює спеціальними методами на об'єктне посилання на віддалений об'єкт.

Усе це реалізується так

Видалимо деяку частину коду - це стосується і клієнта ( testServer.javaі testClient.java)

  1. Виключимо із import бібліотеки org.omg.CosNaming.*; org.omg.CosNaming.NamingContextPackage.*;
  2. Видалимо код відповідний п.3-п.4
Замість віддаленого коду вставимо - для сервера: //перетворимо об'єкт у рядок String ior = orb.object_to_string(testRef); String filename = System.getProperty("user.home") + System.getProperty("file.separator")+"test_file"; //Створюємо файл test_file FileOutputStream fos = new FileOutputStream(filename); PrintStream ps = New PrintStream(fos); //записуємо в нього дані ps.print(ior); ps.close();

для клієнта:

String filename = System.getProperty("user.home") + System.getProperty("file.separator")+"test_file"; //відкриваємо файл FileInputStream fis=new FileInputStream(filename); DataInputStream dis = new DataInputStream(fis); //читаємо дані String ior = dis.readLine(); //перетворимо на об'єкт CORBA org.omg.CORBA.Object obj = orb.string_to_object(ior); //отримуємо посилання на віддалений об'єкт testRef = testHelper.narrow(obj);

Скомпілюємо програми, запустимо сервер і клієнт аналогічно тому, як ми робили це раніше (сервер імен запускати в даному випадкуне треба).