Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот документ является общим обзором того, как создать полный CORBA (Общая Архитектура Посредника запросов к объектам) приложение, используя IDL (Интерфэс Дефинитон Лэнгуэдж), чтобы определить интерфейсы и компилятор IDL Java, чтобы генерировать тупики и скелеты. Для получения дополнительной информации по процессу разработки, и более подробному учебному руководству при создании приложения CORBA, используя IDL, см. Начинание с IDL Java: Привет Мировое Учебное руководство. Можно также создать приложение CORBA, определяя интерфейсы в языке программирования Java. Для получения дополнительной информации и учебное руководство на этом процессе разработки, см. документацию IIOP RMI Java.
В этом выпуске Java SE серверная реализация, сгенерированная компилятором idlj, является Переносимой Моделью Наследования Слуги, также известной как модель POA. POA, или Переносимый Объектный Адаптер, обсуждается более подробно в Переносимом Объектном Адаптере. Этот документ представляет создаваемое использование примера приложения поведения значения по умолчанию компилятора idlj, который использует серверную модель POA.
CORBA поддерживает по крайней мере два различных серверных отображения для того, чтобы реализовать интерфейс IDL:
Используя Модель Наследования, Вы реализуете интерфейс IDL, используя реализацию class, который также расширяет сгенерированный компилятором скелет.
Модели наследования включают:
ОТМЕТЬТЕ: ImplBase осуждается в пользу модели POA, но предоставляется, чтобы позволить совместимость с серверами, записанными в J2SE 1.3 и предшествующий. Мы не рекомендуем создать новые серверы, используя эту нестандартную модель.
Используя Модель Делегации, Вы реализуете интерфейс IDL, используя два класса:
Модель Делегации также известна как модель Связи, или модель Делегации Связи. Это наследовалось или от POA или от ImplBase сгенерированный компилятором скелет, таким образом, модели будут описаны как POA/Tie или модели ImplBase/Tie в этом документе.
Это учебное руководство представляет модель Наследования POA для серверной реализации. Для учебных руководств, используя другие серверные реализации, см. следующие документы:
Модель Связи является моделью делегации. Используйте компилятор idlj, чтобы сначала генерировать серверную привязку. Затем, выполните компилятор idlj во второй раз с с опцией -fallTie, чтобы генерировать серверную привязку модели Связи. Для интерфейса Hello HelloPOATie.java является одним из сгенерированных файлов. Конструктор к HelloPOATie берет delegate или delegate и poa. Следует обеспечить реализацию для delegate и/или poa, но делегат не должен наследоваться ни от какого другого class, только интерфейс HelloOperations. Для получения дополнительной информации обратитесь к IDL к Спецификации Отображения Языка Java.
Вы могли бы хотеть использовать модель Связи вместо типичной модели Наследования, если Ваша реализация должна наследоваться от некоторой другой реализации. Java позволяет любое число наследования интерфейса, но есть только один слот для наследования class. Если Вы используете модель наследования, тот слот израсходован. При использовании Модели Связи тот слот освобождается для Вашего собственного использования. Недостаток - то, что это представляет уровень абстракции: один дополнительный вызов метода происходит, вызывая метод.
Серверная модель ImplBase является Моделью Наследования, как модель POA. Используйте компилятор idlj с флагом -oldImplBase, чтобы генерировать серверную привязку, которая является совместимой с версиями IDL Java до J2SE 1.4. Учитывая интерфейс Hello, определенный в Hello.idl, файл сгенерирован _HelloImplBase.java. Следует обеспечить реализацию для Hello, и это должно наследоваться от _HelloImplBase.
Отметьте, что использование флага -oldImplBase нестандартно: эти API осуждаются. Вы использовали бы этот флаг ТОЛЬКО для совместимости с существующими серверами, записанными в J2SE 1.3 или ранее. В этом случае Вы должны были бы изменить существующий MAKE-ФАЙЛ, чтобы добавить флаг -oldImplBase к компилятору idlj, иначе POA-на-основе серверные отображения будут сгенерированы.
Этот документ содержит:
Чтобы создать этот пример, создайте каталог под названием hello/, где Вы разрабатываете примеры приложения и создаете файлы в этом каталоге, или загружаете пример кода и разархивировали это в Ваш каталог примеров приложения.
Hello.idl
)Первый шаг к создаванию приложения CORBA должен определить все Ваши объекты и их интерфейсы, используя Язык определения интерфейсов OMG (IDL). IDL имеет синтаксис, подобный C++, и может использоваться, чтобы определить модули, интерфейсы, структуры данных, и больше. IDL может быть отображен на множество языков программирования. IDL, отображающийся для Java, получается в итоге в IDL к Сводке Отображения Языка Java.
Следующий код пишется в IDL OMG, и описывает объект CORBA, работа sayHello() которого возвращает строку и чей метод shutdown() завершает работу ШАРА. Чтобы узнать больше о Синтаксисе IDL OMG и Семантике, считайте Главу 3
Hello.idl
module HelloApp { interface Hello { string sayHello(); oneway void shutdown(); }; };ОТМЕТЬТЕ: при записи кода в IDL OMG не используйте имя интерфейса в качестве имени модуля. Выполнение так рискует получать непоследовательные результаты, компилируя с инструментами от различных поставщиков, таким образом подвергая опасности мобильность кода. Например, код, содержащий те же самые имена, мог быть скомпилирован с IDL в компилятор Java от Sun Microsystems и получить один результат. Тот же самый код, скомпилированный с IDL другого поставщика в компилятор Java, мог привести к различному результату.
Чтобы завершить приложение, Вы просто обеспечиваете сервер (HelloServer.java
) и клиент (HelloClient.java
) реализации.
HelloServer.java
)Сервер в качестве примера состоит из двух классов, слуги и сервера. Слуга, HelloImpl, является реализацией интерфейса IDL Hello; каждый экземпляр Hello реализуется экземпляром HelloImpl. Слуга является подклассом HelloPOA, который сгенерирован компилятором idlj от IDL в качестве примера. Слуга содержит один метод для каждой работы IDL, в этом примере, методах sayHello() И shutdown(). Методы слуги точно так же как обычные методы Java; дополнительный код, чтобы иметь дело с ШАРОМ, с параметрами маршалинга и результатами, и так далее, обеспечивается скелетом.
У HelloServer class есть метод main() сервера, который:
Этот пример обеспечивает пример сервера временного объекта. Для примера "Привет Мировой" программы с персистентным объектным сервером см. Пример 2: Привет Мир с Постоянным состоянием. Для большего количества обсуждения серверов CORBA см. Серверы Разработки.
Для большего количества обсуждения кода см., что подробная учебная тема Начинает с IDL Java: Разработка Привет Мирового Сервера.
HelloServer.java
// HelloServer.java // Copyright and License import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import org.omg.PortableServer.*; import org.omg.PortableServer.POA; import java.util.Properties; class HelloImpl extends HelloPOA { private ORB orb; public void setORB(ORB orb_val) { orb = orb_val; } // implement sayHello() method public String sayHello() { return "\nHello world !!\n"; } // implement shutdown() method public void shutdown() { orb.shutdown(false); } } public class HelloServer { public static void main(String args[]) { try{ // create and initialize the ORB ORB orb = ORB.init(args, null); // get reference to rootpoa & activate the POAManager POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); // create servant and register it with the ORB HelloImpl helloImpl = new HelloImpl(); helloImpl.setORB(orb); // get object reference from the servant org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref); // get the root naming context // NameService invokes the name service org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); // Use NamingContextExt which is part of the Interoperable // Naming Service (INS) specification. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // bind the Object Reference in Naming String name = "Hello"; NameComponent path[] = ncRef.to_name( name ); ncRef.rebind(path, href); System.out.println("HelloServer ready and waiting ..."); // wait for invocations from clients orb.run(); } catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } System.out.println("HelloServer Exiting ..."); } }
HelloClient.java
)Клиент приложения в качестве примера, который следует:
Для большего количества обсуждения деталей кода см. Начинание с IDL 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); } } }
Несмотря на его простой проект, Привет Мировая программа позволяет Вам учиться и экспериментировать со всеми задачами, требуемыми разработать почти любую программу CORBA, которая использует статический вызов. Статический вызов, который использует клиентский тупик для вызова и скелет сервера для вызываемой службы, используется, когда интерфейс объекта известен во время компиляции. Если интерфейс не известен во время компиляции, динамический вызов должен использоваться.
Этот пример требует службы именования, которая является службой CORBA, которая позволяет объектам CORBA быть названными посредством привязки имени к ссылке на объект. Привязка имени может быть сохранена в службе именования, и клиент может предоставить имя, чтобы получить требуемую ссылку на объект. Эти две опции для Именования Служб, поставленных с этим выпуском Java, SE включают orbd, процесс демона, содержащий Службу Начальной загрузки, Переходную Службу Именования, Персистентную Службу Именования, и Диспетчер серверов, и tnameserv, переходная услуга именования, которая предоставляется для обратной совместимости. Этот пример использует orbd.
Выполняя этот пример, помните, что при использовании программного обеспечения Соляриса следует стать корнем, чтобы запустить процесс на порту под 1024. Поэтому мы рекомендуем, чтобы Вы использовали номер порта, больше чем или равный 1024. Опция -ORBInitialPort используется, чтобы переопределить номер порта значения по умолчанию в этом примере. Следующие инструкции предполагают, что можно использовать порт 1050 для Демона Посредника запросов к объектам IDL Java, orbd. Можно заменить различным портом в случае необходимости. Выполняя эти примеры на машине Windows, subtitute наклонная черта влево (\) в путях.
Выполнять это клиент-серверное приложение на Вашей машине разработки:
idlj -fall Hello.idl
Следует использовать опцию -fall с компилятором idlj, чтобы генерировать и клиент и серверную привязку. Эта командная строка генерирует серверную привязку значения по умолчанию, который принимает серверную модель Наследования POA. Для получения дополнительной информации по опциям idlj см. опции компилятора IDL к Java.
Компилятор idlj генерирует много файлов. Фактическое число сгенерированных файлов зависит от опций, выбранных, когда файл IDL компилируется. Сгенерированные файлы обеспечивают стандартную функциональность, таким образом, можно проигнорировать их, пока не пора развернуть и выполнить Вашу программу. Файлы, сгенерированные компилятором idlj для Hello.idl, с параметром командной строки -fall:
Этот абстрактный class является основанным на потоке скелетом сервера, обеспечивая основную функциональность CORBA для сервера. Это расширяет org.omg.PortableServer.Serva nt, и реализует интерфейс InvokeHandler и интерфейс HelloOperations. Сервер class HelloImpl расширяет HelloPOA.
Этот class является клиентским тупиком, предоставляя функциональность CORBA клиенту. Это расширяет org.omg.CORBA.portable.ObjectImpl и реализует интерфейс Hello.java.
Этот интерфейс содержит версию Java нашего интерфейса IDL. Интерфейс Hello.java расширяет org.omg.CORBA.Object, обеспечивая стандартную функциональность объекта CORBA. Это также расширяет интерфейс HelloOperations и org.omg.CORBA.portable.IDLEntity.
Этот class обеспечивает вспомогательную функциональность, особенно метод narrow(), требуемый бросать ссылки на объект CORBA на их надлежащие типы. Помощник class ответственен за чтение и запись типа данных к потокам CORBA, и вставки и извлечения типа данных от Any s. Держатель class делегирует к методам в Помощнике class для чтения и записи.
Этот заключительный class содержит общедоступного члена экземпляра типа Hello. Всякий раз, когда типом IDL является out или параметр inout, Держатель, class используется. Это обеспечивает операции для org.omg.CORBA.portable.OutputStream и параметров org.omg.CORBA.portable.InputStream, которые CORBA позволяет, но которые не отображаются легко на семантику Java. Держатель class делегирует к методам в Помощнике class для чтения и записи. Это реализует org.omg.CORBA.portable.Streamable.
Этот интерфейс содержит методы sayHello() и shutdown(). Отображение IDL к Java помещает все операции, определенные в интерфейсе IDL в этот файл, который совместно используется и тупиками и скелетами.
javac *.java HelloApp/*.java
Чтобы запустить orbd с командного процессора UNIX, войдите:
orbd -ORBInitialPort 1050&
От системного приглашения MS-DOS (Windows) войдите:
start orbd -ORBInitialPort 1050
Отметьте, что 1050 является портом, на котором Вы хотите, чтобы сервер имени работал. Параметром -ORBInitialPort является необходимый параметр командной строки. Отметьте, что при использовании программного обеспечения Соляриса, следует стать корнем, чтобы запустить процесс на порту под 1024. Поэтому мы рекомендуем, чтобы Вы использовали номер порта, больше чем или равный 1024.
Для примера того, как выполнить эту программу на двух машинах, см. Выполнение Привет Мировой Программы на 2 машинах.
Чтобы запустить Привет сервер от командного процессора UNIX, войдите:
java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost&
От системного приглашения MS-DOS (Windows) войдите:
start java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost
Вы будете видеть HelloServer ready and waiting..., когда сервер будет запущен.
Для этого примера можно опустить -ORBInitialHost localhost, так как сервер имени работает на том же самом узле как Привет сервер. Если сервер имени работает на различном узле, используйте -ORBInitialHost nameserverhost, чтобы определить узел, на котором работает сервер имени IDL.
Определите сервер имени (orbd) порт как сделано в предыдущем шаге, например, -ORBInitialPort 1050.
java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost
Когда клиент будет работать, Вы будете видеть ответ, такой как следование Вашего терминала: Obtained a handle on server object: IOR: (binary code) Hello World! HelloServer exiting...
Для этого примера можно опустить -ORBInitialHost localhost, так как сервер имени работает на том же самом узле как Привет клиент. Если сервер имени работает на различном узле, используйте -ORBInitialHost nameserverhost, чтобы определить узел, на котором работает сервер имени IDL.
Определите сервер имени (orbd) порт как сделано в предыдущем шаге, например, -ORBInitialPort 1050.
Когда Вы закончили это учебное руководство, убедиться, что завершили работу или уничтожили сервер имени (orbd). Чтобы сделать это от командной строки DOS, выберите окно, которое выполняет сервер, и введите Ctrl+C, чтобы завершить работу этого. Чтобы сделать это от оболочки Unix, найдите процесс, и уничтожьте его. Сервер будет продолжать ожидать вызовов, пока он не будет явно остановлен.
Запущение Привет Мирового Приложения на Двух Машинах описывает один способ распределить простое приложение через две машины - клиент и сервер.