Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот документ является общим обзором того, как создать полный CORBA (Общая Архитектура Посредника запросов к объектам) приложение, используя IDL (Интерфэс Дефинитон Лэнгуэдж), чтобы определить интерфейсы и компилятор IDL Java, чтобы генерировать тупики и скелеты. Этот документ описывает использование Модели Серверной стороны Наследования ImplBase.
Компилятор idlj теперь генерирует отображения серверной стороны, основанные на Модели Наследования POA как значение по умолчанию. Для совместимости с существующими приложениями новый флаг был добавлен к компилятору idlj, чтобы позволить этому генерировать отображения серверной стороны, основанные на Модели Наследования ImplBase, -oldImplBase. Существующие приложения, которые должны говорить с серверами, создаваемыми в J2SE 1.3 или предшествующий, возможно, должны обновить свой MAKE-ФАЙЛ так, чтобы этот флаг использовался, однако, новые приложения, у которых нет таких требований, не должны генерировать эти осуждаемые отображения.
ОТМЕТЬТЕ: ImplBase осуждается в пользу модели POA, но предоставляется, чтобы позволить совместимость с серверами, записанными в J2SE 1.3 и предшествующий. Мы не рекомендуем создать новые серверы, используя эту нестандартную модель.
Этот документ содержит:
Hello.idl
)Первый шаг к создаванию приложения CORBA должен определить все Ваши объекты и их интерфейсы, используя Язык определения интерфейсов OMG (IDL). IDL имеет синтаксис, подобный C++, и может использоваться, чтобы определить модули, интерфейсы, структуры данных, и больше. IDL может быть отображен на множество языков программирования. IDL, отображающийся для Java, получается в итоге в IDL к Сводке Отображения Языка Java.
Следующий код пишется в IDL OMG, и описывает объект CORBA, работа sayHello() которого возвращает строку и чья работа shutdown() завершает работу ШАРА. Чтобы узнать больше о Синтаксисе IDL OMG и Семантике, соединитесь с Веб-сайтом 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. Слуга является подклассом _HelloImplBase, который сгенерирован компилятором idlj от IDL в качестве примера. Слуга содержит один метод для каждой работы IDL, в этом примере, методах sayHello() И shutdown(). Методы слуги точно так же как обычные методы Java; дополнительный код, чтобы иметь дело с ШАРОМ, с параметрами маршалинга и результатами, и так далее, обеспечивается скелетом.
У класса HelloServer есть метод main() сервера, который:
ОТМЕТЬТЕ: ImplBase осуждается в пользу модели POA, но предоставляется, чтобы позволить совместимость с серверами, записанными в J2SE 1.3 и предшествующий. Мы не рекомендуем создать новые серверы, используя эту нестандартную модель.
HelloServer для реализации серверной стороны ImplBase отличается только немного от ее дубликата POA. Разделы POA-на-основе сервера, которые получают ссылку на корневой POA и активируют POAManager, не необходимы для этой реализации, которая следует:
HelloServer.java
// Copyright and License import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import java.util.Properties; class HelloImpl extends _HelloImplBase{ private ORB orb; public void setORB(ORB orb_val){ orb = orb_val; } public String sayHello(){ return "\nHello world !!\n"; } 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); // create servant and register it with the ORB HelloImpl helloImpl = new HelloImpl(); helloImpl.setORB(orb); // get the root naming context org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); Hello href = HelloHelper.narrow(helloImpl); // bind the Object Reference in Naming NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = {nc}; 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
)Клиент приложения в качестве примера, который следует, подобен тому, представленному в учебном руководстве по умолчанию, однако, новые Взаимодействующие функции Службы Именования не используются в этом примере, чтобы сохранить обратную совместимость. Клиентское приложение в качестве примера:
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"); NamingContext ncRef = NamingContextHelper.narrow(objRef); // resolve the Object Reference in Naming NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = {nc}; Hello helloImpl = HelloHelper.narrow(ncRef.resolve(path)); 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 является tnameserv, переходная служба именования, и orbd, который является процессом демона, содержащим Службу Начальной загрузки, Переходную Службу Именования, Персистентную Службу Именования, и Диспетчер серверов. Этот пример использует orbd.
Выполняя этот пример, помните, что при использовании программного обеспечения Соляриса следует стать корнем, чтобы запустить процесс на порту под 1024. Поэтому мы рекомендуем, чтобы Вы использовали номер порта, больше чем или равный 1024. Опция -ORBInitialPort используется, чтобы переопределить номер порта по умолчанию в этом примере. Следующие инструкции предполагают, что можно использовать порт 1050 для Демона Посредника запросов к объектам IDL Java, orbd. Можно заменить различным портом в случае необходимости. Выполняя эти примеры на машине Windows, subtitute наклонная черта влево (\) в путях.
Выполнять это клиент-серверное приложение на Вашей машине разработки:
ОТМЕТЬТЕ: ImplBase осуждается в пользу модели POA, но предоставляется, чтобы позволить совместимость с серверами, записанными в J2SE 1.3 и предшествующий. Мы не рекомендуем создать новые серверы, используя эту нестандартную модель.
idlj -fall -oldImplBase Hello.idl
Следует использовать опцию -fall с компилятором idlj, чтобы генерировать и клиент и привязку серверной стороны. Эта командная строка генерирует привязку серверной стороны по умолчанию, который принимает модель программирования POA. Опция -oldImplBase говорит компилятору генерировать привязку серверной стороны Модели Наследования ImplBase вместо привязки серверной стороны Модели Наследования POA по умолчанию. Для получения дополнительной информации по опциям idlj соединитесь с опциями компилятора IDL к Java.
Компилятор idlj генерирует много файлов. Фактическое число сгенерированных файлов зависит от опций, выбранных, когда файл IDL компилируется. Сгенерированные файлы обеспечивают стандартную функциональность, таким образом, можно проигнорировать их, пока не пора развернуть и выполнить Вашу программу. Файлы, сгенерированные компилятором idlj для Hello.idl, с параметром командной строки -fall:
Этот абстрактный класс является скелетом сервера, обеспечивая основную функциональность CORBA для сервера. Это реализует InvokeHandler и интерфейс Hello. Это наследовалось от org.omg.CORBA.portable.ObjectImpl. Класс сервера HelloImpl наследовался от _HelloImplBase.
Этот класс является клиентским тупиком, предоставляя функциональность CORBA клиенту. Это наследовалось от org.omg.CORBA.portable.ObjectImpl и реализует интерфейс Hello.
Этот интерфейс содержит версию Java нашего интерфейса IDL. Интерфейс Hello.java наследовался от org.omg.CORBA.Object, обеспечивая стандартную функциональность объекта CORBA. Это также наследовалось от HelloOperations и org.omg.CORBA.portable.IDLEntity.
Этот класс обеспечивает вспомогательную функциональность, особенно метод narrow(), требуемый бросать ссылки на объект CORBA на их надлежащие типы. Класс Помощника ответственен за чтение и запись типа данных к потокам CORBA, и вставки и извлечения типа данных от Any s. Класс Держателя делегирует к методам в классе Помощника для чтения и записи.
Этот класс final содержит общедоступного члена экземпляра типа Hello. Всякий раз, когда типом IDL является out или параметр inout, класс Держателя используется. Это обеспечивает операции для org.omg.CORBA.portable.OutputStream и параметров org.omg.CORBA.portable.InputStream, которые CORBA позволяет, но которые не отображаются легко на семантику Java. Класс Держателя делегирует к методам в классе Помощника для чтения и записи. Это реализует org.omg.CORBA.portable.Streamable.
Этот интерфейс содержит методы sayHello() и shutdown(). Отображение IDL к Java помещает все операции, определенные в интерфейсе IDL в этот файл, который совместно используется и тупиками и скелетами.
javac *.java HelloApp/*.java
Чтобы запустить orbd с командного процессора UNIX, войдите:
orbd -ORBInitialPort 1050 -ORBInitialHost localhost&
От системного приглашения MS-DOS (Windows) войдите:
start orbd -ORBInitialPort 1050 -ORBInitialHost localhost
Отметьте, что 1050 является портом, на котором Вы хотите, чтобы сервер имени работал. -ORBInitialPort является необходимым параметром командной строки. Отметьте, что при использовании программного обеспечения Соляриса, следует стать корнем, чтобы запустить процесс на порту под 1024. Поэтому мы рекомендуем, чтобы Вы использовали номер порта, больше чем или равный 1024.
-ORBInitialHost является дополнительным параметром командной строки. Для этого примера, начиная с обоих клиентов и серверов при работе машины разработки, мы установили узел localhost. Разрабатывая больше чем на одной машине, Вы замените это именем узла. Для примера того, как выполнить эту программу на двух машинах, см. Выполнение Привет Мировой Программы на 2 машинах.
Чтобы запустить Привет сервер от командного процессора UNIX, войдите:
java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost&
От системного приглашения MS-DOS (Windows) войдите:
start java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost
Для этого примера можно опустить -ORBInitialHost localhost, так как сервер имени работает на том же самом узле как Привет сервер. Если сервер имени работает на различном узле, используйте -ORBInitialHost nameserverhost, чтобы определить узел, на котором работает сервер имени IDL.
Определите сервер имени (orbd) порт как сделано в предыдущем шаге, например, -ORBInitialPort 1050.
Когда сервер будет работать, он повторит следующее сообщение назад к терминалу:
HelloServer ready and waiting ...
java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost
Для этого примера можно опустить -ORBInitialHost localhost, так как сервер имени работает на том же самом узле как Привет клиент. Если сервер имени работает на различном узле, используйте -ORBInitialHost nameserverhost, чтобы определить узел, на котором работает сервер имени IDL.
Определите сервер имени (orbd) порт как сделано в предыдущем шаге, например, -ORBInitialPort 1050.
Когда клиент будет работать, следующее сообщение отзовется эхом к терминалу:
Obtained a handle on server object: IOR: ... Hello World !! HelloServer Exiting ...
Когда Вы закончили это учебное руководство, убедиться, что завершили работу или уничтожили сервер имени (orbd). Чтобы сделать это от командной строки DOS, выберите окно, которое выполняет сервер, и введите Ctrl+C, чтобы завершить работу этого. Чтобы сделать это от оболочки Unix, найдите процесс, и уничтожьте его. Сервер будет продолжать ожидать вызовов, пока он не будет явно остановлен.
Запущение Привет Мирового Приложения на Двух Машинах описывает один способ распределить простое приложение через две машины - клиент и сервер.