Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот документ является общим обзором того, как создать полный CORBA (Общая Архитектура Посредника запросов к объектам) приложение, используя IDL (Интерфэс Дефинитон Лэнгуэдж), чтобы определить интерфейсы и компилятор IDL Java, чтобы генерировать тупики и скелеты. Для получения дополнительной информации по процессу разработки, и более подробному учебному руководству при создании приложения CORBA, используя IDL, см. Начинание с IDL Java: Привет Мировое Учебное руководство. Можно также создать приложения CORBA, определяя интерфейсы в языке программирования Java. Для получения дополнительной информации и учебное руководство на этом процессе разработки, см. документацию IIOP RMI Java.
Для получения дополнительной информации по переходному процессу по сравнению с персистентными серверами сошлитесь на документ, Разрабатывающий Серверы.
Этот документ содержит:
PersistentHello.idl
)Первый шаг к создаванию приложения CORBA должен определить все Ваши объекты и их интерфейсы, используя Язык определения интерфейсов OMG (IDL). IDL имеет синтаксис, подобный C++, и может использоваться, чтобы определить модули, интерфейсы, структуры данных, и больше. IDL может быть отображен на множество языков программирования. IDL, отображающийся для Java, получается в итоге в IDL к Сводке Отображения Языка Java.
Следующий код пишется в IDL OMG, и описывает объект CORBA, работа sayHello() которого возвращает строку и чей метод shutdown() завершает работу ШАРА. Чтобы узнать больше о Синтаксисе IDL OMG и Семантике, считайте Главу 3
PersistentHello.idl
module Persistent { interface Hello { string sayHello( ); oneway void shutdown(); }; };ОТМЕТЬТЕ: при записи кода в IDL OMG не используйте интерфейсное имя в качестве имени модуля. Выполнение так рискует получать непоследовательные результаты, компилируя с инструментами от различных поставщиков, таким образом подвергая опасности мобильность кода. Например, код, содержащий те же самые имена, мог быть скомпилирован с IDL в компилятор Java от Sun Microsystems и получить один результат. Тот же самый код, скомпилированный с IDL другого поставщика в компилятор Java, мог привести к различному результату.
Чтобы завершить приложение, Вы просто обеспечиваете сервер (PersistentServer.java
), слуга (PersistentHelloServant.java
), и клиент (PersistentClient.java
) реализации.
PersistentServer.java
)У сервера в качестве примера, PersistentServer, есть метод main() сервера, который:
Этот пример обеспечивает пример персистентного объектного сервера. Для примера "Привет Мировой" программы с сервером временного объекта см. Привет Мир с Переходным Сервером. Для большего количества обсуждения серверов CORBA см. Серверы Разработки.
PersistentServer.java
// PersistentServer.java // Copyright and License import java.util.Properties; import org.omg.CORBA.Object; import org.omg.CORBA.ORB; import org.omg.CosNaming.NameComponent; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.CORBA.Policy; import org.omg.PortableServer.POA; import org.omg.PortableServer.*; import org.omg.PortableServer.Servant; public class PersistentServer { public static void main( String args[] ) { Properties properties = System.getProperties(); properties.put( "org.omg.CORBA.ORBInitialHost", "localhost" ); properties.put( "org.omg.CORBA.ORBInitialPort", "1050" ); try { // Step 1: Instantiate the ORB ORB orb = ORB.init(args, properties); // Step 2: Instantiate the servant PersistentHelloServant servant = new PersistentHelloServant(orb); // Step 3 : Create a POA with Persistent Policy // ******************* // Step 3-1: Get the rootPOA POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); // Step 3-2: Create the Persistent Policy Policy[] persistentPolicy = new Policy[1]; persistentPolicy[0] = rootPOA.create_lifespan_policy( LifespanPolicyValue.PERSISTENT); // Step 3-3: Create a POA by passing the Persistent Policy POA persistentPOA = rootPOA.create_POA("childPOA", null, persistentPolicy ); // Step 3-4: Activate PersistentPOA's POAManager, Without this // All calls to Persistent Server will hang because POAManager // will be in the 'HOLD' state. persistentPOA.the_POAManager().activate( ); // *********************** // Step 4: Associate the servant with PersistentPOA persistentPOA.activate_object( servant ); // Step 5: Resolve RootNaming context and bind a name for the // servant. // NOTE: If the Server is persistent in nature then using Persistent // Name Service is a good choice. Even if ORBD is restarted the Name // Bindings will be intact. To use Persistent Name Service use // 'NameService' as the key for resolve_initial_references() when // ORBD is running. org.omg.CORBA.Object obj = orb.resolve_initial_references( "NameService" ); NamingContextExt rootContext = NamingContextExtHelper.narrow( obj ); NameComponent[] nc = rootContext.to_name( "PersistentServerTutorial" ); rootContext.rebind( nc, persistentPOA.servant_to_reference( servant ) ); // Step 6: We are ready to receive client requests orb.run(); } catch ( Exception e ) { System.err.println( "Exception in Persistent Server Startup " + e ); } } }
PersistentHelloServant.java
)Слуга в качестве примера, PersistentHelloServant, является реализацией интерфейса IDL Hello; каждый экземпляр Hello реализуется экземпляром PersistentHelloServant. Слуга является подклассом HelloPOA, который сгенерирован компилятором idlj от IDL в качестве примера. Слуга содержит один метод для каждой работы IDL, в этом примере, методах sayHello() И shutdown(). Методы слуги точно так же как обычные методы Java; дополнительный код, чтобы иметь дело с ШАРОМ, с параметрами маршалинга и результатами, и так далее, обеспечивается скелетом.
PersistentHelloServant.java
// PersistentHelloServant.java // Copyright and License import org.omg.CORBA.ORB; public class PersistentHelloServant extends Persistent.HelloPOA { private ORB orb; public PersistentHelloServant( ORB orb ) { this.orb = orb; } /** * sayHello() method implementation returns a simple message. */ public String sayHello( ) { return "Hello From Persistent Server..."; } /** * shutdown() method shuts down the Persistent Server. * See NOTE below. */ public void shutdown( ) { orb.shutdown( false ); } }
Отметьте: Для удобства представления в этом примере метод shutdown() включается как часть слуги. Это было сделано, чтобы демонстрировать персистентность сервера в этом примере. Это не рекомендуемое соглашение программирования по следующим причинам:
PersistentClient.java
)Клиент приложения в качестве примера, который следует:
PersistentClient.java
// Copyright and License import java.util.Properties; import org.omg.CORBA.ORB; import org.omg.CORBA.OBJ_ADAPTER; import org.omg.CosNaming.NamingContext; import org.omg.CosNaming.NamingContextHelper; import org.omg.CosNaming.NameComponent; import org.omg.PortableServer.POA; import Persistent.HelloHelper; import Persistent.Hello; public class PersistentClient { public static void main(String args[]) { try { // Step 1: Instantiate the ORB ORB orb = ORB.init(args, null); // Step 2: Resolve the PersistentHelloServant by using INS's // corbaname url. The URL locates the NameService running on // localhost and listening on 1050 and resolve // 'PersistentServerTutorial' from that NameService org.omg.CORBA.Object obj = orb.string_to_object( "corbaname::localhost:1050#PersistentServerTutorial"); Hello hello = HelloHelper.narrow( obj ); // Step 3: Call the sayHello() method every 60 seconds and shutdown // the server. Next call from the client will restart the server, // because it is persistent in nature. while( true ) { System.out.println( "Calling Persistent Server.." ); String helloFromServer = hello.sayHello(); System.out.println("Message From Persistent Server: " + helloFromServer ); System.out.println( "Shutting down Persistent Server.." ); hello.shutdown( ); Thread.sleep( 60000 ); } } catch ( Exception e ) { System.err.println( "Exception in PersistentClient.java..." + e ); e.printStackTrace( ); } } }
Несмотря на его простой проект, Привет Мировая программа позволяет Вам учиться и экспериментировать со всеми задачами, требуемыми разработать почти любую программу CORBA, которая использует статический вызов.
Этот пример требует службы именования, которая является службой CORBA, которая позволяет объектам CORBA быть названными посредством привязки имени к ссылке на объект. Привязка имени может быть сохранена в службе именования, и клиент может предоставить имя, чтобы получить требуемую ссылку на объект. Этот пример использует orbd, который содержит Персистентную Службу Именования и Диспетчер серверов.
Выполняя этот пример, помните, что при использовании программного обеспечения Соляриса следует стать корнем, чтобы запустить процесс на порту под 1024. Поэтому мы рекомендуем, чтобы Вы использовали номер порта, больше чем или равный 1024. Следующие инструкции предполагают, что можно установить опцию -ORBInitialPort, чтобы использовать порт 1050 для Демона Посредника запросов к объектам IDL Java, orbd. Можно заменить различным портом в случае необходимости.
Выполнять это клиент-серверное приложение на Вашей машине разработки:
idlj -fall -td . -verbose PersistentHello.idl
Следует использовать опцию -fall с компилятором idlj, чтобы генерировать и клиент и привязку серверной стороны. Эта командная строка генерирует привязку серверной стороны по умолчанию, который принимает модель серверной стороны Наследования POA. Для получения дополнительной информации по опциям idlj см. опции компилятора IDL к Java.
Компилятор idlj генерирует много файлов. Фактическое число сгенерированных файлов зависит от опций, выбранных, когда файл IDL компилируется. Сгенерированные файлы обеспечивают стандартную функциональность, таким образом, можно проигнорировать их, пока не пора развернуть и выполнить Вашу программу. Файлы, сгенерированные компилятором idlj для PersistentHello.idl, с параметром командной строки -fall:
Этот абстрактный класс является основанным на потоке скелетом сервера, обеспечивая основную функциональность CORBA для сервера. Это расширяет org.omg. PortableServer. Слуга, и реализации InvokeHandler взаимодействуют через интерфейс и интерфейс HelloOperations. Класс сервера PersistentHelloServant расширяет HelloPOA.
Этот класс является клиентским тупиком, предоставляя функциональность 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 Persistent/*.java
Чтобы запустить orbd, введите одно из следующего:
Операционная система Unix:
orbd -ORBInitialPort 1050 -serverPollingTime 200&
Операционная система Windows:
start orbd -ORBInitialPort 1050 -serverPollingTime 200&
Отметьте, что 1050 является портом, на котором Вы хотите, чтобы сервер имени работал. Параметром -ORBInitialPort является необходимый параметр командной строки. Отметьте, что при использовании программного обеспечения Соляриса, следует стать корнем, чтобы запустить процесс на порту под 1024. Поэтому мы рекомендуем, чтобы Вы использовали номер порта, больше чем или равный 1024.
Параметр -serverPollingTime 200 определяет, как часто ORBD проверяет на здоровье персистентных серверов, зарегистрированных через servertool. Значение по умолчанию составляет 1 000 мс. Мы устанавливаем эти параметры к 200 мс в этом примере, чтобы включить более частому контролю отказов. Когда отказ сервера обнаруживается, сервер будет перезапущен к его надлежащему состоянию.
Чтобы зарегистрировать персистентный сервер в ORBD, сервер должен быть запущен, используя servertool, который является интерфейсом командной строки для прикладных программистов, чтобы зарегистрировать, незарегистрировать, запустить, и завершить работу персистентного сервера. Когда servertool запускается, следует определить порт и узел (если отличающийся), на котором выполняется orbd.
Запускаться Привет сервер,
servertool -ORBInitialPort 1050 (Unix operating system) start servertool -ORBInitialPort 1050 (Windows operating system)
Удостоверьтесь сервер имени (orbd), порт является тем же самым как в предыдущем шаге, например, -ORBInitialPort 1050. servertool должен быть запущен на том же самом порту как сервер имени.
Интерфейс командной строки servertool появляется:
servertool > register -server PersistentServer -applicationName s1 -classpath path_to_server_class_files
servertool регистрирует сервер, присваивает его имя "s1", и выводит на экран его идентификатор сервера.
java -classpath . PersistentClient
Окно терминала или командная строка DOS выводят на экран следующие сообщения:
Calling Persistent Server.. Message From Persistent Server: Hello From Persistent Server... Shutting down Persistent Server.. Calling Persistent Server.. Message From Persistent Server: Hello From Persistent Server... Shutting down Persistent Server..
В этом примере клиент вызывает метод sayHello() каждую минуту и затем уничтожает персистентный сервер, который будет автоматически перезапущен в следующий раз, когда клиент вызывает метод sayHello().
Когда Вы закончили это учебное руководство, убедиться, что завершили работу или уничтожили сервер имени (orbd). Чтобы сделать это от командной строки DOS, выберите окно, которое выполняет сервер, и введите Ctrl+C, чтобы завершить работу этого. Чтобы сделать это от оболочки Unix, введите pkill ordb из окна терминала. Сервер будет продолжать ожидать вызовов, пока он не будет явно остановлен.
Запущение Привет Мирового Приложения на Двух Машинах описывает один способ распределить простое приложение через две машины - клиент и сервер.
Следующий код обеспечивает пример Make-файла, который может использоваться, чтобы выполнить этот пример. Измените расположение JAVA_HOME к расположению, где Вы устанавливали J2SE 5.0. Замените переменную CLASSPATH к каталогу, где Вы создали пример приложения. Этот пример для операционной системы Unix, измените соответственно, используя операционную систему Windows.
#Change to location of your Java SE installation. JAVA_HOME=/home/user_name/j2sdk1.5.0/ CLASSPATH=. JAVAC=$(JAVA_HOME)/bin/javac JAVA=$(JAVA_HOME)/bin/java ORB_INITIAL_PORT=1050 ORB_INITIAL_HOST=localhost ORB_ACTIVATION_PORT=1049 #Change ClassPath based on where your PersistentServer is located. export CLASSPATH=<path to server class files> IDLJ :=$(JAVA_HOME)/bin/idlj ORB_PROPS=-Dorg.omg.CORBA.ORBInitialHost=$(ORB_INITIAL_HOST) -Dorg.omg.CORBA.ORBInitialPort=$(ORB_INITIAL_PORT) IDLJ_FLAGS=-fall -td . -verbose ORBD=${JAVA_HOME}/bin/orbd -ORBInitialPort ${ORB_INITIAL_PORT} -port ${ORB_ACTIVATION_PORT} -serverPollingTime 200 -serverStartupDelay 1000 SERVERTOOL=${JAVA_HOME}/bin/servertool all: clean build run build: stubs stubs: $(IDLJ) $(IDLJ_FLAGS) PersistentHello.idl $(JAVAC) *.java $(JAVAC) Persistent/*.java runc: $(JAVA) -classpath . PersistentClient runorbd: $(ORBD) # Enter the following command in servertool to register server: # (without the # sign) # register -server PersistentServer -applicationName s1 -classpath path_to_server_class_files servertool: $(SERVERTOOL) -ORBInitialPort $(ORB_INITIAL_PORT) clean: rm -rf Persistent rm -rf *.class
Чтобы запустить приложение, используя Make-файл, введите следующие команды: