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

Автор:

С тех пор, как потребность в взаимодействии между 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 программы:

using   System;
using Middsol;

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

namespace HelloCorba
{
  public class GreetingsImpl: GreetingsPOA
  {
    public override string hello( string a_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, а в случае ошибки избавляется от его:

class Server
{
  static void Main(string[] args)
  {
    Middsol.CORBA.ORB oOrb = Middsol.CORBA._ORB.init( args, null);

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

Middsol.PortableServer.POA oRootPOA =
  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 -f client hello.idl

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

javac HelloCorba\*.java
jar -cvf HelloCorba.jar HelloCorba\*.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);
}
}

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

javac GreetingsClient.java
java GreetingsClient

В окне 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

Теги: .Net C# CORBA java