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

Используя Активаторы Адаптера

Создавая новый POA, разработчик приложений может объявить определенные варианты политики для нового POA и обеспечить различный активатор адаптера и менеджера слуги (они - объекты обратного вызова, используемые POA, чтобы активировать POAs по требованию и активировать слуг). Создание нового POAs также позволяет разработчику приложений делить пространство имен объектов, поскольку Объектные Идентификаторы интерпретируются относительно POA. Наконец, создавая новый POAs, разработчик может независимо управлять обработкой запросов для многократных наборов объектов.

Активатор адаптера является дополнительным. Вы использовали бы активатор адаптера, если POAs должен быть создан во время обработки запросов. Если все нуждались в POAs, создаются, когда приложение инициализируется, активатор адаптера не требуется.

Активатор адаптера предоставляет POA возможность создать дочерний POAs по требованию как побочный эффект получения запроса, который называет дочерний POA (или один из его дочерних элементов), или когда find_POA метод вызывают с активировать значением параметра ИСТИНЫ. ШАР Вызовет работу на активатор адаптера, когда запрос будет получен для дочернего POA, который в настоящий момент не существует. Активатор адаптера может тогда создать необходимый POA по требованию.

Запрос должен быть способным к передаче Объектного Идентификатора целевого объекта так же как идентификации POA, который создал целевую ссылку на объект. Когда клиент выпускает запрос, ШАР сначала определяет местоположение соответствующего сервера (возможно, запускающийся один если нужно), и затем он определяет местоположение соответствующего POA в пределах того сервера.

Если POA не существует в серверном процессе, у приложения есть возможность воссоздать необходимый POA при использовании активатора адаптера. Активатор адаптера является реализованным пользователем объектом, который может быть связан с POA. Это вызывается ШАРОМ, когда запрос получается для несуществующего дочернего POA. У активатора адаптера есть возможность создать необходимый POA. Если это не делает, клиент получает ADAPTER_NONEXISTENT исключение.

Как только ШАР определил местоположение соответствующего POA, он поставляет запрос этому POA. Дальнейшая обработка того запроса зависит оба от политик, связанных с этим POA так же как текущее состояние объекта активации.

Пример Используя Активаторы Адаптера

Следующий пример кода показывает приложение что Активаторы Адаптера использования, чтобы позволить POA создаваться во время обработки запросов. Это приложение основывается на "Привет Мировом" примере. Следующие файлы включаются в этот пример:

Для получения инструкций по выполнению этого примера см. Запущение Приложения Активатора Адаптера В качестве примера.

Client.java

Код для клиента в качестве примера инициализирует ШАР, решения HelloServant, и вызывает метод sayHello().

//Client.java
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContext;
import org.omg.CosNaming.NamingContextHelper;
import org.omg.CosNaming.NameComponent;

public class Client {

    public void run(String[] args) {
        try {
            //initialize the orb
            ORB orb = ORB.init(args, null);
            System.out.println("ORB initialized");

            NamingContext namingContext = NamingContextHelper.narrow(
                orb.resolve_initial_references("NameService"));
            NameComponent[] nc = { new NameComponent("HelloServer", "") };

            //resolve HelloServant and invoke sayHello()
            Hello helloRef = HelloHelper.narrow(namingContext.resolve(nc));
            System.out.println("Resolved HelloServant");

            System.out.println(helloRef.sayHello());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Client().run(args);
    }
}

Server.java

Код для сервера делает следующее:

//Server.java
import org.omg.CORBA.ORB;
import org.omg.CORBA.LocalObject;
import org.omg.CORBA.Policy;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.AdapterActivator;
import org.omg.PortableServer.IdAssignmentPolicyValue;
import org.omg.PortableServer.LifespanPolicyValue;
import org.omg.PortableServer.ImplicitActivationPolicyValue;
import org.omg.CosNaming.NamingContext;
import org.omg.CosNaming.NamingContextHelper;
import org.omg.CosNaming.NameComponent;

public class Server {

    public void run(String[] args) {
        try {
            //initialize the orb
            ORB orb = ORB.init(args, null);
            System.out.println("ORB initialized");

            //resolve RootPOA
            POA rootPOA = POAHelper.narrow(
                orb.resolve_initial_references("RootPOA"));

            //register adapter activator with rootPOA so that child POAs can
            //be created on demand
            rootPOA.the_activator(new MyAdapterActivator());

            //find_POA with an activate parameter TRUE would cause the
            //adapter activator associated with rootPOA to be invoked if
            //'HelloPOA' does not exist
            POA childPOA = rootPOA.find_POA("HelloPOA", true);

            //Create the object reference for HelloServant
            //and register with naming service
            org.omg.CORBA.Object obj = childPOA.id_to_reference(
                "abcd".getBytes());
            Hello helloRef = HelloHelper.narrow(obj);

            NamingContext namingContext = NamingContextHelper.narrow(
                orb.resolve_initial_references("NameService"));
            NameComponent[] nc = { new NameComponent("HelloServer", "") };
            namingContext.rebind(nc, helloRef);

            //Destroy 'HelloPOA'. This POA will be transparently recreated when
            //ORB receives a request on HelloPOA using the adapter activator we
            //registered with the RootPOA
            childPOA.destroy(true, true);

            //activate rootPOA
            rootPOA.the_POAManager().activate();

            //wait for incoming requests
            System.out.println("Server ready and running....");
            orb.run();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Server().run(args);
    }
}

class MyAdapterActivator extends LocalObject implements AdapterActivator {

    public boolean unknown_adapter(POA parent, String name) {
        System.out.println("unknown_adapter() invoked for POA - " + name);
        try {
            // create the POA with appropriate policies
            // this sample uses PERSISTENT, NO_IMPLICIT_ACTIVATION
            // and USER_ID policies
            Policy[] policy = new Policy[3];
            policy[0] = parent.create_lifespan_policy(
                LifespanPolicyValue.PERSISTENT);
            policy[1] = parent.create_id_assignment_policy(
                IdAssignmentPolicyValue.USER_ID);
            policy[2] = parent.create_implicit_activation_policy(
                ImplicitActivationPolicyValue.NO_IMPLICIT_ACTIVATION);

            POA child = parent.create_POA(name, null, policy);

            //Associate the servant with the new POA
            HelloServant hello = new HelloServant();
            child.activate_object_with_id("abcd".getBytes(), hello);

            //activate the new POA
            child.the_POAManager().activate();

            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}

Hello.idl

Этот Язык определения интерфейсов (IDL) файл используется во всех "Привет Мировых" изменениях в качестве примера на этом сайте. Этот файл IDL описывает объект CORBA, работа sayHello() которого возвращает строку.
interface Hello { string sayHello(); }; 

HelloServant.java

Слуга является реализацией Привет интерфейс IDL; каждый экземпляр Hello реализуется экземпляром HelloServant. Слуга является подклассом HelloPOA, который сгенерирован компилятором idlj от IDL в качестве примера. Слуга содержит один метод для каждой работы IDL, в этом примере, методе sayHello(). Методы слуги точно так же как обычные методы Java; дополнительный код, чтобы иметь дело с ШАРОМ, с параметрами маршалинга и результатами, и так далее, обеспечивается скелетом.
//HelloServant.java
public class HelloServant extends HelloPOA {

    public String sayHello() {
        return "Hello :)";
    }
}

Make-файл

Сделать программа генерирует последовательность команд для выполнения оболочкой Unix.

JAVA_HOME=<path_to_your_Java_installation_bin_directory>

#setup tools
JAVA=$(JAVA_HOME)/bin/java
JAVAC=$(JAVA_HOME)/bin/javac
IDLJ=$(JAVA_HOME)/bin/idlj
ORBD=$(JAVA_HOME)/bin/orbd

all     : clean build run

clean   :
        - rm -rf classes orb.db

build   :
        mkdir -p classes
        $(IDLJ) -fall -td classes Hello.idl
        $(JAVAC) -classpath classes -d classes HelloServant.java Server.java Client.java

run     : runorbd register runclient

runorbd :
        $(ORBD) -ORBInitialPort 10001 &
        sleep 20

register:
        #servertool does not support script based register due to a bug
        #using class instead
        #Please note that the name of the servertool 
        #class may change in future releases.
        $(JAVA) com.sun.corba.se.internal.Activation.ServerTool \
        -ORBInitialPort 10001 -cmd \
        register -server Server -classpath classes

runclient :
        $(JAVA) -classpath classes Client -ORBInitialPort 10001


run.bat

bat утилита генерирует последовательность команд для выполнения командным процессором Microsoft Windows.

SET JAVA_HOME=<path_to_your_Java_installation_build_directory>

mkdir classes

%JAVA_HOME%\bin\idlj -fall -td classes Hello.idl
%JAVA_HOME%\bin\javac -classpath classes -d classes HelloServant.java Server.java Client.java

REM - Start the ORB daemon

start %JAVA_HOME%\bin\orbd -ORBInitialPort 10001 -ORBDebug orbd
@echo Wait 10-15 seconds for the orbd to start
@pause

REM - Register the persistent server with orbd using servertool
REM - Please note that the name of the servertool 
REM - class may change in future releases.
%JAVA_HOME%\bin\java com.sun.corba.se.internal.Activation.ServerTool -ORBInitialPort 10001 -cmd register -server Server -classpath classes

%JAVA_HOME%\bin\java -classpath classes Client -ORBInitialPort 10001

Запущение Приложения Активатора Адаптера В качестве примера

Выполнять этот пример,

Вы будете видеть вывод, сгенерированный к окну терминала, подобному этому ниже, когда Вы выполните Make-файл:

rm -rf classes orb.db mkdir -p classes /j2sdk1.5.0/bin/idlj -fall -td classes Hello.idl /j2sdk1.5.0/bin/javac -classpath classes -d classes HelloServant.java Server.java Client.java /j2sdk1.5.0/bin/orbd -ORBInitialPort 10001 & sleep 20 #servertool does not support script based register due to a bug #using class instead #Please note that the name of the servertool 
#class may change in future releases.
/j2sdk1.5.0/bin/java com.sun.corba.se.internal.Activation.ServerTool \
-ORBInitialPort 10001 -cmd \
register -server Server -classpath classes

        server registered (serverid = 257).

/j2sdk1.5.0/bin/java -classpath classes Client -ORBInitialPort 10001
ORB initialized
Resolved HelloServant
Hello :)
Выключенный ORBD, когда Вы завершили этот пример.

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