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 создаваться во время обработки запросов. Это приложение основывается на "Привет Мировом" примере. Следующие файлы включаются в этот пример:
Для получения инструкций по выполнению этого примера см. Запущение Приложения Активатора Адаптера В качестве примера.
Код для клиента в качестве примера инициализирует ШАР, решения 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 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; } }
interface Hello { string sayHello(); };
//HelloServant.java public class HelloServant extends HelloPOA { public String sayHello() { return "Hello :)"; } }
Сделать программа генерирует последовательность команд для выполнения оболочкой 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
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, когда Вы завершили этот пример. pkill orbd
в окне терминала.Ctrl+C
в окне командной строки.