Главная > Технологии > Java и .Net - способность к взаимодействию через CORBA

Тема Зацепин
268

Java-разработчик 🧩
359
1 минуту

Java и .Net - способность к взаимодействию через CORBA

Автор: Генрих Штюртц

Добавлено : 2 Mar 2009, 15:52

С тех пор, как потребность в взаимодействии между Java и .Net стала общей проблемой крупных организаций, CORBA не часто использовалась для постройки моста между этими двумя мирами. Нехватка коммерчески доступного CORBA продукта для .Net требовала высоких инвестиций в эту технологию, что вело к существенным финансовым и временным расходам. Начиная с выпуска MiddCor компанией Middsol в прошлом году, этот барьер исчез. В данной статье исследуются фундаментальные понятия использования CORBA в гетерогенной окружающей среде, состоящей из Java и .Net и демонстрируется простая реализация объектных запросов между Java и .Net.

Многие корпораций требуют от сегодняшних гетерогенных окружающих программных сред обеспечения взаимодействия между платформами, простирающиеся за пределы свободного сцепления, обеспеченного Web-службами. CORBA, как альтернатива, доступен на стороне Java, но до недавнего времени отсутствовал объектный брокер для .Net, написанный на C#, или Visual Basic .Net. С выпуском MiddCor стала доступной полная CORBA-инфраструктура для Java и .Net и проблема такой интеграции фактически исчезла.

Hello CORBA – аппликация

В этой статье Вы узнаете как написать простую CORBA программу типа "Hello World", в которой клиент вызывает сервер и передает параметр sendMsg типа String. Сервер пишет "Hello " + sendMsg на экране монитора и возвращает строку "Good Bye Winter" клиенту, а тот выдает возвращенную строку также на экране монитора.

Программный код сервера для hello примера прилагается к тестовой версии MiddCor. Вы можете быстро стартовать сервер даже после модификации типовых исходных файлов.

Чтобы создать эту аппликацию Вам необходимо три продукта:

  • Microsoft .Net Framework SDK или Visual Studio .Net 2003.
  • J2EE или J2SE весии Java Sun 1.4 SDK.
  • CORBA для .Net. В настоящее время единственный коммерческим продуктом является MiddCor компании Middsol. Его 30-ти дневная тестовая версия бесплатно предлагается на вебсайте изготовителя (www.middsol.ru).

Подготовка IDL

IDL (interface definition language) определяет именное пространство, названия классов и методов для интерфейсов запроса. Его конструкции напоминают явские интерфейсы. IDL типовой аппликации довольно прост:

module HelloCorba
{
interface Greetings
{
string hello( in string sendMsg);
};
};

Секция module определяет пространство имен. Мы создадим это пространство в файле IOR (interoperable object reference) так, чтобы клиент мог его использовать и чтобы мог найти службу ссылок. В C# коде сервера в секцию namespace будет включена имплементация Вашего класса.

interface - название типа серверного объекта. Для фактической имплементации по общепринятому соглашению используется суффикс Impl.

Kласс Greetings имеет открытую функцию hello(), которая ожидает строку в качестве параметра и возвращает также строку. Заметьте, что в примере используется только тип данных IDL string.

Сохраните файл в директории по вашего выбору и назовите его hello.idl.

Подготовка сервера

Запустите MiddCor-IDL-компилятор, MiddCorIdl.exe:

> middcoridl hello.idl

Он создаст один C# файл под именем hello.cs. Этот файл содержит стаб клиента и код скелетона сервера для класса Greetings. Фактический класс выполнения GreetingsImpl получен из скелетонного класса GreetingsPOA (генерирован из CORBA класса серванта). Код стаба клиента не используется, поскольку наш клиент будет ява-программой.

Осталось лишь закодировать классы GreetingsImpl и Server. Последний обеспечит процесс выполнения для ORB и создаст серверный объект.

Сначала, сделаем доступными классы в именных просранствах System и Middsol. System включает классы для всех типов данных и требуется для каждой .Net программы:

usingSystem;usingMiddsol;

В HelloCorba namespace реализуем два класса, описанные выше. GreetingsImpl - класс, выставленный через CORBA. Он получен из GreetingsPOA и содержит простую логику типовой аппликации (Примечание: a_ приставка - соглашение, используемое Middsol, чтобы сделать код более удобочитаемым и используется для параметров аргумента. Вы можете называть параметры, как Вам нравиться.):

namespaceHelloCorba{publicclassGreetingsImpl:GreetingsPOA{publicoverridestringhello(stringa_sendMsg){System.Console.WriteLine("Client says: Hello {0}\n",a_sendMsg);return"Good Bye Winter";}}}

Метод main() класса Server инициализирует ORB, находит root POA (Portable Object Adapter), активизирует POA менеджера, и создает файл IOR для клиента. Затем запускает ORB, а в случае ошибки избавляется от его:

classServer{staticvoidMain(string[]args){Middsol.CORBA.ORBoOrb=Middsol.CORBA._ORB.init(args,null);

Наш свежеинициализированный ORB держит rootPOA процесс в состоянии ожидания. Мы должны получить ссылку на него, чтобы его активизировать. resolve_initial_references возвращает ссылку на объект типа CORBA.Object, который должен быть преобразован в PortableServer.POA:

Middsol.PortableServer.POAoRootPOA=Middsol.PortableServer.POAHelper.narrow(oOrb.resolve_initial_references("RootPOA"));oRootPOA.the_POAManager.activate();

Следующим шагом создаем объект типа GreetingsImpl, к которому будет обращаться клиент с запросами:

GreetingsImpl oGreetings = new GreetingsImpl();

Теперь соединим имплементацию серванта с POA, получим ссылку на CORBA объект и запишем ее в IOR файл:

Middsol.CORBA.Object obj = oRootPOA.servant_to_reference( oGreetings );
Middsol.CORBA._ORB.wrIORtoFile
( "c:\\hello.ior", obj );

Остальная часть работы на сервере тривиальна – запускайте ORB и сообщите пользователю, что он стартован, а в случае ошибки разрушьте его:

try
{
oOrb.run();
System.Console.WriteLine
("Server is running ...\n" );
}
catch( System.Exception )
{
oOrb.destroy();
}

Запомните этот код в файле helloSrv.cs, откомпилируйте и запустите полученную программу (не забудьте включить hello.cs в Ваш Visual Studio проект). Должно появиться DOS окно и показаться сообщение "Server is running ...". Наш сервер теперь ждет запросов.

Подготовка клиента

Явский код клиента еще более прост. Чтобы совсем ничего не мешало выбросим и обработки исключений.

Для начала создайте копию файла hello.idl и запусите Java IDL компилятор idlj. Опция -f client избавит от ненужного нам кода скелетона:

idlj-fclienthello.idl

Компилятор IDL создаст поддиректорий HelloCorba по названию модуля, а в нем пять исходных файлов. Их назначение опустим – посмотрите сами. Откомпилируйте произведенный код и создайте jar файл:

javacHelloCorba\*.javajar-cvfHelloCorba.jarHelloCorba\*.class

Теперь всё готово для кодировки клиента. Создайте java файл в директории, где уже находится файл HelloCorba.jar. Сначала импортируем необходимые java классы:

import HelloCorba.*;
import org.omg.CORBA.ORB;
import java.io.*;

Затем выполнение класса GreetingsClient. Он содержит только main() метод:

public class GreetingsClient
{
public static void main(String args[]) throws IOException
{

Первая строка инициализирует ORB, аналогично C# классу Server, описанному ранее:

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

Теперь клиент читает IOR файл, созданный сервером. Если клиент стартует на другом компъютере, то и IOR файл должен находиться там же:

FileReader fr = new FileReader("c:\\hello.ior");
BufferedReader br =
new BufferedReader(fr);
String ior = br.readLine
();

Используя метод ORB string_to_object, IOR может быть преобразован в объектную ссылку:

org.omg.CORBA.Object obj = orb.string_to_object(ior);

Полученная ссылка должна быть конвертированна в тип Greetings:

Greetings proxy = GreetingsHelper.narrow(obj);

Теперь можно благополучно вызвать удаленный объект и выдать полученное сообщение на консоле:

String msg = proxy.hello("Spring");
System.out.println
("Server says: " + msg);
}
}

Откомпилируйте и запустите клиента:

javacGreetingsClient.javajavaGreetingsClient

В окне DOS’а должна появиться строка "Server says: Good Bye Winter". В это же самое время, строка "Client says: Hello Spring" должна появиться в окне сервера.

Вместо IOR можно использовать службу наименований (naming service), например orbd или tnameserv, прилагаемые к Java SDK.

Заключение

Этот проект демонстрирует, что CORBA - мощное средство взаимодействия между .Net и Java. CORBA сложна и за день стать мастером нельзя, но с использованием CORBA .Net и с минимальными знаниями можно приступать к работе, поскольку большинство сложностей похоронено в недрах ORB.

Источник оригинала

Компания:Middsol GmbH

Теги: .NetC#CORBAjava

Еще от автора

Применение WeakHashmap для списков слушателей

В статье от 11мая 1999 года Reference Objects были описаны основные идеи применения ссылочных объектов, но не приводилось детального описания. Данная статья позволит вам получить больше сведений, касающихся данной темы. В основном ссылочные объекты применяются для косвенных ссылок на память необходимую объектам. Ссылочные объекты хранятся в очереди (класс ReferenceQueue), в которой отслеживается доступность ссылочных объектов. Исходя из типа ссылочного объекта, сборщик мусора может освобождать память даже тогда, когда обычные ссылки не могут быть освобождены.

Заставки в Mustang

Согласно определению, данному в Wikipedia, заставка - это компьютерный термин, обозначающий рисунок, появляющийся во время загрузки программы или операционной системы. Заставка для пользователя является визуальным отображением инициализации программы. До выхода версии Java SE 6 (кодовое название Mustang) единственной возможностью применения заставки было создание окна, во время запуска метода main, и размещение в нем картинки. Хотя данный способ и работал, но он требовал полной инициализации исполняемой Java среды до появления окна заставки. При инициализации загружались библиотеки AWT и Swing, таким образом, появление заставки задерживалось. В Mustang появился новый аргумент командной строки, значительно облегчающий использование заставок. Этот способ позволяет выводить заставку значительно быстрее до запуска исполняемой Java среды. Окончательное добавление данной функциональности находится на рассмотрении в JCP.

Совмещение изображений

1 Введение 2 Правила визуализации и пример 3 Совмещение изображений в оперативной памяти 4 Постепенное исчезновение изображения 5 Ссылки и дополнительная информация

Еще по теме

Применение WeakHashmap для списков слушателей

В статье от 11мая 1999 года Reference Objects были описаны основные идеи применения ссылочных объектов, но не приводилось детального описания. Данная статья позволит вам получить больше сведений, касающихся данной темы. В основном ссылочные объекты применяются для косвенных ссылок на память необходимую объектам. Ссылочные объекты хранятся в очереди (класс ReferenceQueue), в которой отслеживается доступность ссылочных объектов. Исходя из типа ссылочного объекта, сборщик мусора может освобождать память даже тогда, когда обычные ссылки не могут быть освобождены.

Заставки в Mustang

Согласно определению, данному в Wikipedia, заставка - это компьютерный термин, обозначающий рисунок, появляющийся во время загрузки программы или операционной системы. Заставка для пользователя является визуальным отображением инициализации программы. До выхода версии Java SE 6 (кодовое название Mustang) единственной возможностью применения заставки было создание окна, во время запуска метода main, и размещение в нем картинки. Хотя данный способ и работал, но он требовал полной инициализации исполняемой Java среды до появления окна заставки. При инициализации загружались библиотеки AWT и Swing, таким образом, появление заставки задерживалось. В Mustang появился новый аргумент командной строки, значительно облегчающий использование заставок. Этот способ позволяет выводить заставку значительно быстрее до запуска исполняемой Java среды. Окончательное добавление данной функциональности находится на рассмотрении в JCP.

Использование потоков

1 Введение 2 Работа с выражениями типа Boolean 3 Класс JoptionPane 4 Приложение-счетчик 5 Ссылки

Перехват необрабатываемых исключений

В статье от 16 марта 2004 года Best Practices in Exception Handling были описаны приемы обработки исключений. В данной статье вы изучите новый способ обработки исключений при помощи класса UncaughtExceptionHandler добавленного в J2SE 5.0.

Использование класса LinkedHashMap

1 Введение 2 Сортировка хэш-таблицы 3 Копирование таблицы 4 Сохранение порядка доступа к элементам 5 Ссылки

Сказ про кодировки и java

С кодировками в java плохо. Т.е., наоборот, все идеально хорошо: внутреннее представление строк – Utf16-BE (и поддержка Unicode была с самых первых дней). Все возможные функции умеют преобразовывать строку из маленького регистра в большой, проверять является ли данный символ буквой или цифрой, выполнять поиск в строке (в том числе с регулярными выражениями) и прочее и прочее. Для этих операций не нужно использовать какие-то посторонние библиотеки вроде привычных для php mbstring или iconv. Как говорится, поддержка многоязычных тестов “есть в коробке”. Так откуда берутся проблемы? Проблемы возникают, как только строки текста пытаются “выбраться” из jvm (операции вывода текста различным потребителям) или наоборот пытаются в эту самую jvm “залезть” (операция чтения данных от некоторого поставщика).