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