Spec-Zone .ru
спецификации, руководства, описания, API
|
Эта тема представляет основы записи клиентского приложения CORBA. Включенный в этот урок:
Создать HelloClient.java,
HelloClient.java
// Copyright and License 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); } } }
Этот раздел объясняет каждую строку HelloClient.java, описывая, что код делает, так же как почему это необходимо для этого приложения.
Основная оболочка клиента CORBA является тем же самым так много приложений Java: Вы импортируете требуемые пакеты библиотеки, объявляете приложение class, определяете метод main, и обрабатываете исключения.
Во-первых, мы импортируем пакеты, требуемые для клиента class:
import HelloApp.*; // the package containing our stubs import org.omg.CosNaming.*; // HelloClient will use the Naming Service import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; // All CORBA applications need these classes
Следующий шаг должен объявить клиент class:
public class HelloClient { // The main() method goes here. }
Каждое приложение Java нуждается в методе main(). Это объявляется в рамках HelloClient class, следующим образом:
public static void main(String args[]) { // The try-catch block goes here. }
Поскольку все программы CORBA могут выдать системные исключения CORBA во времени выполнения, вся функциональность main() помещается в пределах блока try-catch. Программы CORBA выдают системные исключения всякий раз, когда проблема происходит во время любого из процессов (маршалинг, немаршалинг, upcall) включенный в вызов.
Наш обработчик исключений просто печатает имя исключения, и его стек прослеживают до стандартного вывода, таким образом, можно видеть, какая вещь пошла не так, как надо.
Блок try-catch устанавливается в main(),
try{ // Add the rest of the HelloClient code here. } catch(Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); }
Клиент CORBA нуждается в локальном объекте ШАРА выполнить весь его маршалинг и работу IIOP. Каждый клиент инстанцирует объекта org.omg.CORBA.ORB и инициализирует его, передавая к объектной определенной информации о себе.
Переменная ШАРА объявляется и инициализируется в блоке try-catch.
ORB orb = ORB.init(args, null);
Звонок в метод init() ШАРА передает в параметрах командной строки Вашего приложения, разрешая Вам установить определенные свойства во времени выполнения.
Теперь, когда у приложения есть ШАР, оно может попросить, чтобы ШАР определил местоположение практической эксплуатации, в которой оно нуждается, в этом случае Привет сервер. Есть много способов для клиента CORBA получить начальную ссылку на объект; наше клиентское приложение будет использовать Службу Именования COS, определенную OMG и предоставленный IDL Java. См. Используя Ссылки на объект Stringified для информации о том, как получить начальную ссылку на объект, когда нет никакой доступной службы именования.
Этими двумя опциями для Именования Служб, поставленных с J2SE v.1.4, является orbd, который является процессом демона, содержащим Службу Начальной загрузки, Переходную Службу Именования, Персистентную Службу Именования, и Диспетчер серверов, и tnameserv, переходную службу именования. Этот пример использует orbd.
Первый шаг в использовании службы именования должен получить начальный контекст именования. В блоке try-catch, ниже Вашей инициализации ШАРА, Вы вызываете orb.resolve_initial_references(), чтобы получить ссылку на объект на сервер имени:
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
Строка "NameService" определяется для всех ШАРОВ CORBA. Когда Вы передаете в той строке, ШАР возвращает начальный контекст именования, ссылку на объект на службу имен. Строка "NameService" указывает:
Строка "TNameService" указывает, что переходная служба именования будет использоваться, когда ORBD будет службой именования. В этом примере мы используем персистентную службу именования, которая является частью orbd.
Как со всеми ссылками на объект CORBA, objRef является универсальным объектом CORBA. Чтобы использовать это в качестве объекта NamingContextExt, следует сузить это к его надлежащему типу.
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
Здесь мы видим использование idlj - сгенерированный помощник class, подобный в функции к HelloHelper. Объектом ncRef является теперь org.omg.CosNaming.NamingContextExt, и можно использовать его, чтобы получить доступ к службе именования и найти другие службы. Вы сделаете это в следующем шаге.
Объект NamingContextExt в новинку для J2SE v.1.4, и является частью Взаимодействующей Службы Именования.
Чтобы опубликовать ссылку в Службе Именования к объекту Hello реализация интерфейса Hello, Вы сначала нуждаетесь в строке идентификации для объекта Hello.
String name = "Hello";
Наконец, мы передаем name к методу resolve_str() службы именования, чтобы получить ссылку на объект на Привет сервер и сузить это к объекту Hello:
helloImpl = HelloHelper.narrow(ncRef.resolve-str(name)); System.out.println("Obtained a handle on server object: " + helloImpl);
Здесь Вы видите помощника HelloHelper class на работе. Метод resolve-str() возвращает универсальный объект CORBA, как Вы видели выше, определяя местоположение службы имен непосредственно. Поэтому, Вы сразу сужаете это к объекту Hello, который является ссылкой на объект, Вы должны выполнить остальную часть Вашей работы. Затем, Вы отправляете сообщение экрану, подтверждающему, что ссылка на объект была получена.
Вызовы CORBA похожи на вызов метода на локальном объекте. Сложности параметров маршалинга к проводу, направляя их к серверному ШАРУ, немаршалингу, и размещению upcall к методу сервера абсолютно прозрачны клиентскому программисту. Поскольку так много делается для Вас сгенерированным кодом, вызов является действительно самой легкой частью программирования CORBA.
Наконец, мы печатаем результаты вызова к стандартному выводу и явно завершению работы ШАР:
System.out.println(helloImpl.sayHello()); helloImpl.shutdown();
Теперь мы скомпилируем HelloClient.java так, чтобы мы могли исправить любые ошибки прежде, чем продолжать с этим учебным руководством.
Пользователи Windows отмечают, что следует заменить наклонными чертами влево (\) наклонные черты (/) во всех путях в этом документе.
Скомпилировать HelloClient.java,
javac HelloClient.java HelloApp/*.java