Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

IDL Java: "Привет Мировой" Пример

Используя POA, персистентный сервер, и персистентную службу именования

Этот документ является общим обзором того, как создать полный 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 CORBA 2.3.1 Спецификации.

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. Можно заменить различным портом в случае необходимости.

Выполнять это клиент-серверное приложение на Вашей машине разработки:

  1. Создайте или загрузите IDL и файлы Java для этого примера.
  2. Изменитесь на каталог, который содержит файл PersistentHello.idl.
  3. Выполните компилятор IDL к Java, idlj, на файле IDL, чтобы создать тупики и скелеты. Этот шаг предполагает, что Вы включали путь к каталогу java/bin в Вашем пути.
      idlj  -fall -td . -verbose  PersistentHello.idl
    

    Следует использовать опцию -fall с компилятором idlj, чтобы генерировать и клиент и серверную привязку. Эта командная строка генерирует серверную привязку значения по умолчанию, который принимает серверную модель Наследования POA. Для получения дополнительной информации по опциям idlj см. опции компилятора IDL к Java.

    Компилятор idlj генерирует много файлов. Фактическое число сгенерированных файлов зависит от опций, выбранных, когда файл IDL компилируется. Сгенерированные файлы обеспечивают стандартную функциональность, таким образом, можно проигнорировать их, пока не пора развернуть и выполнить Вашу программу. Файлы, сгенерированные компилятором idlj для PersistentHello.idl, с параметром командной строки -fall:

  4. Скомпилируйте файлы .java, включая тупики и скелеты (которые находятся в каталоге Persistent). Этот шаг предполагает, что каталог java/bin включается в Ваш путь.
       javac *.java Persistent/*.java
    
  5. Запустите orbd.

    Чтобы запустить orbd, введите одно из следующего:

    Отметьте, что 1050 является портом, на котором Вы хотите, чтобы сервер имени работал. Параметром -ORBInitialPort является необходимый параметр командной строки. Отметьте, что при использовании программного обеспечения Соляриса, следует стать корнем, чтобы запустить процесс на порту под 1024. Поэтому мы рекомендуем, чтобы Вы использовали номер порта, больше чем или равный 1024.

    Параметр -serverPollingTime 200 определяет, как часто ORBD проверяет на здоровье персистентных серверов, зарегистрированных через servertool. Значение по умолчанию составляет 1 000 мс. Мы устанавливаем эти параметры к 200 мс в этом примере, чтобы включить более частому контролю отказов. Когда отказ сервера обнаруживается, сервер будет перезапущен к его надлежащему состоянию.

  6. Запустите Привет сервер:

    Чтобы зарегистрировать персистентный сервер в ORBD, сервер должен быть запущен, используя servertool, который является интерфейсом командной строки для прикладных программистов, чтобы зарегистрироваться, незарегистрироваться, запуститься, и завершение работы персистентный сервер. Когда servertool запускается, следует определить порт и узел (если отличающийся), на котором выполняется orbd.

    Запускаться Привет сервер,

  7. Выполните клиентское приложение из командной строки другого окна терминала или командной строки:
      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 из окна терминала. Сервер будет продолжать ожидать вызовов, пока он не будет явно остановлен.

Запущение Привет Мирового Приложения на Двух Машинах описывает один способ распределить простое приложение через две машины - клиент и сервер.

Выполнение Примера на Unix Используя Make-файл

Следующий код обеспечивает пример 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-файл, введите следующие команды:

  1. gnumake создают
  2. gnumake runorbd
  3. gnumake runservertool
  4. В servertool введите команды как показано выше
  5. gnumake runc

Oracle и/или его филиалы Авторское право © 1993, 2012, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами