Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
197
Добавлен:
17.04.2018
Размер:
641.54 Кб
Скачать

ИП. CORBA. Идея

МИЭТ, 2017

Общее для всех языков

описание удаленных

методов

IDL

компилято

(interface definition language)

С++ р

Компиляция по IDL кода методов для

`обмена

Спец.

протокол

обмена

брокера

компилято

р Java

Компиляция по IDL кода методов для обмена

Скомп.

Брокер

Брокер

Скомп.

код обмена

обмена

обмена

код обмена

Код

С++

 

 

Java

Код

приложения

 

 

приложения

Зона ответственности ORM

ИП. CORBA. Архитектура

МИЭТ, 2017

Клиент

Сервер

 

Класс-реализующий (Impl)

 

методы для

Класс-заглушка (Stub),

удаленного доступа

 

ссылающийся

 

на объект на сервере

Сервант, связывающий

 

класс Impl с сервером

ORB

 

ORB

Object Request

 

Object Request

Broker

IIOP

Broker

 

 

 

(Internet Inter-ORB Protocol)

 

Классы ORM

Зона компиляции

То, что должен

 

из файла IDL

написать программист

ИП. CORBA. Пример

МИЭТ, 2017

Рассмотрим для примера реализацию на CORBA такой-же функциональности, что и для RMI

В примере RMI требовалось реализовать удаленный вызов двух методов:

GetData

возвращает модифицированную строку

MakeCalcultae

возвращает сумму элементов

Код интерфейса RMI

public interface RMI extends Remote { //Обявлем простой метод возвращающий строку

public String getData(String text) throws RemoteException;

//Обявлем метод принимающий и возвращающий кастомный объект public Result makeCalculate(BigData bd) throws RemoteException;

}

ИП. CORBA. Пример

МИЭТ, 2017

Процесс создания CORBA-объектов

Написание интерфейса на IDL

Компилирование заглушек из IDL (Stub)

Реализация классов-серверов (Impl)

Создание программы-сервера Server

Создание программы-клиента Client

Запуск службы имен программы-сервера ORB

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

Запуск клиента

ИП. CORBA. Пример. Файл интефейса IDL

Файл RemoteCalculate.idl

module RemoteCalculate {

valuetype Result {

private float Supremum; float getSupremum();

void setSupremum(in float temp);

};

typedef sequence <float, 20> BigData;

interface RCalc {

string getData(in string text);

Result makeCalculate(in BigData bd);

};

};

МИЭТ, 2017

Язык IDL имеет ограниченный список типов

т. к. предназначен для организации универсального межязыкового обмена.

Кроме простых типов вида: int, string, float и т.д. разрешены или

могут быть описаны типы:

последовательность — sequence; структура — structure; тип-значение — valuetype

(может содержать свойства и методы)

ИП. CORBA. Пример. Файл интефейса IDL

МИЭТ, 2017

Компиляция файла idl выполняется командой

idlj -fall RemoteCalculate.idl

idlj - «компилятор» - входящий в состав JDK и JRE Этот компилятор есть для каждого из языков CORBA.

В результате для Java создается ряд *.java файлов, кроме:

Файла сервера

Файла клиента

Файлов имплементации

ИП. CORBA. Пример. Компиляция IDL

МИЭТ, 2017

ИП. CORBA. Пример. Классы имплементации. RCalcImpl

МИЭТ, 2017

package RemoteCalculate; import org.omg.CORBA.*;

public class RCalcImpl extends RCalcPOA {

private ORB orb;

public void setORB(ORB orb_val) { orb = orb_val; }

@Override

public String getData(String text) { //реализация getData text = "Stsrt "+text;

return text;

}

@Override

public Result makeCalculate(float[] bd) { //реализация makeCalculate Result r = new Result();

float suprm = 0;

for(int i=0; i<bd.length; i++) { suprm += bd[i]; }

r.setSupremum(suprm); return r;

}

ИП. CORBA. Пример. Классы имплементации. ResultImpl

МИЭТ, 2017

package RemoteCalculate;

import java.io.Serializable;

public class ResultImpl extends Result implements Serializable {

public ResultImpl() {

}

}

ИП. CORBA. Пример. Класc клиента RcalcClient. Страница 1

МИЭТ, 2017.

package RemoteCalculate;

import java.util.ArrayList; import org.omg.CosNaming.*; import org.omg.CORBA.*;

public class RCalcClient {

static RCalc RCImpl;

public static void main(String args[]) { try {

// создаем объект ORB

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

// Создаем объект пространства имен ORB

org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// Получем ссылку на пространство имен ORB String name = "RCalc";

RCImpl = RCalcHelper.narrow(ncRef.resolve_str(name));

//Теперь можно вызывать удаленные методы

String _rtemp = RCImpl.getData("Test"); //С русскими буквами не сработало System.out.println("--------------------------------------"); System.out.println(_rtemp);

Соседние файлы в папке Интернет технологии