|
Spec-Zone .ru
спецификации, руководства, описания, API
|
ActivatableЭто учебное руководство описывает, как реализовать activatable удаленный объект, расширяя class java.rmi.activation.Activatable. Это учебное руководство использует a Setup программа (описанный в учебном руководстве Используя Активацию: Setup Программа), который регистрирует информацию о activatable удаленном объекте с JavaTM Удаленный Вызов метода (Java RMI) системный демон активации (rmid) и затем связывает тупик для того удаленного объекта в rmiregistry так, чтобы клиенты могли искать это. Можно хотеть считать то учебное руководство перед этим.
У этого учебного руководства есть следующие шаги:
Setup программаФайлы, необходимые для этого учебного руководства:
MyRemoteInterface.java - простой удаленный интерфейсExtendsActivatable.java - "activatable" реализация удаленного интерфейсаClient.java - клиент, который использует удаленный интерфейсclient.policy - файл политики безопасности для клиентаЕсть несколько основных способов реализовать activatable удаленный объект. Это учебное руководство описывает, как реализовать activatable удаленный объект, расширяя class java.rmi.activation.Activatable который экспортирует activatable удаленный объект во время конструкции.
Удаленный объект активируется, когда клиент вызывает удаленный метод на тупик для activatable удаленного объекта. Тупик для activatable удаленного объекта содержит ID активации удаленного объекта и информацию о том, как связаться с Java системный демон активации RMI (rmid) для удаленного объекта. Если тупик не может соединиться с последним - известный адрес (то есть, узел/порт) для удаленного объекта, тупик свяжется с активатором удаленного объекта (rmid) активировать объект. Когда rmid получает запрос активации, он запускает группу активации удаленного объекта (или контейнер) VM, если группа уже не выполняется, и затем rmid просит группа делать экземпляр удаленного объекта. Как только группа создает удаленный объект, она возвращает тупик удаленного объекта rmid который, поочередно, возвращает фактический тупик тупику инициирования так, чтобы тупик инициирования мог обновить свою информацию о том, как связаться с удаленным объектом в будущем.
Прежде, чем любая эта активация может иметь место, приложение должно зарегистрировать информацию о activatable удаленных объектах, которые это должно использовать. Следующее отдельное учебное руководство описывает информацию, необходимую к activatate удаленный объект и как зарегистрировать эту информацию в rmid:
В этом примере activatable удаленный объект реализует следующий удаленный интерфейс examples.activation.MyRemoteInterface:
package examples.activation;
import java.rmi.*;
public interface MyRemoteInterface extends Remote {
Object remoteMethod(Object obj) throws RemoteException;
}
Реализация class, examples.activation.ExtendsActivatable, поскольку activatable удаленный объект следующие:
package examples.activation;
import java.rmi.*;
import java.rmi.activation.*;
public class ExtendsActivatable
extends Activatable
implements MyRemoteInterface
{
public ExtendsActivatable(ActivationID id, MarshalledObject data)
throws RemoteException
{
super(id, 0);
}
public Object remoteMethod(Object obj) {
return obj;
}
}
class ExtendsActivatable расширяет class Activatable и реализует удаленный интерфейс MyRemoteInterface.
class ExtendsActivatable объявляет специального конструктора "активации", которого группа активации вызывает, чтобы создать экземпляр во время процесса активации. Этот специальный конструктор берет два параметра:
ActivationID, идентификатор для activatable удаленного объекта. Когда приложение регистрирует дескриптор активации в rmid, rmid присваивает это ID активации, который обращается к информации, связанной с дескриптором. Этот тот же самый ID активации (также содержавшийся в тупике удаленного объекта) передают этому конструктору, когда удаленный объект активируется.MarshalledObject это содержит данные инициализации, предварительно зарегистрированные в rmid. Эти данные инициализации могут быть именем файла для постоянного состояния объекта, например. Этот пример не требует, чтобы никакие данные инициализации создали удаленный объект.Конструктор просто вызывает конструктора в суперклассе (Activatable) экспортировать объект на anoymous порту.
Наконец, class реализует единственный метод удаленного интерфейса, remoteMethod возвратить объект, который передают как параметр.
Client программа ищет тупик удаленного объекта (тот, который реализует удаленный интерфейс MyRemoteInterface) в реестре на узле, предоставленном как дополнительный первый параметр, и затем, вызывает тупик remoteMethod метод. Когда этот клиент вызовет удаленный метод на тупик, полученный от реестра, удаленный объект уже активируется если не активный.
Источник для программы следующие:
package examples.activation;
import java.rmi.*;
import java.rmi.registry.*;
public class Client {
public static void main(String args[]) throws Exception {
String hostname = "localhost";
if (args.length < 1) {
System.err.println(
"usage: java [options] examples.activation.Client <hostname>");
System.exit(1);
} else {
hostname = args[0];
}
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
String name = System.getProperty("examples.activation.name");
Registry registry = LocateRegistry.getRegistry(hostname);
MyRemoteInterface stub =
(MyRemoteInterface) registry.lookup(name);
System.err.println("Obtained stub from the registry.");
System.err.println("Invoking remote method...");
String result = (String) stub.remoteMethod("hello there!");
System.err.println("Returned from remote call.");
System.err.println("Result: " + result);
}
}
Эта программа должна быть выполнена следующим образом:
java -cp clientDir \
-Djava.security.policy=client.policy \
-Dexamples.activation.client.codebase=clientCodebase \
-Dexamples.activation.name=name \
examples.activation.Client [host]
где:
Отметьте: rmid должен работать на его порту значения по умолчанию, и rmiregistry должен работать на его порту значения по умолчанию (оба на удаленном узле) до выполнения этой программы.
Следующее является примером client.policy файл, который предоставляет соответствующие полномочия для примеров активации:
grant codeBase "${examples.activation.client.codebase}" {
// permissions to read system properties required by the client
permission java.util.PropertyPermission "examples.activation.name","read";
// permission to connect to the registry, activation system, and remote host
permission java.net.SocketPermission "*:1024-","connect";
};
Кодовая база, которой предоставляют полномочия, является файлом URL, определяющий расположение классов клиента. Этот файл URL является значением examples.activation.client.codebase системное свойство, определенное, когда клиентская программа выполняется. Клиент нуждается в двух полномочиях:
java.util.PropertyPermission - считать системное свойство examples.activation.name это определяет имя для тупика в реестреjava.net.SocketPermission - соединяться с реестром, системой активации, и узлом удаленного объектаИсходные файлы для этого примера могут быть скомпилированы следующим образом:
javac -d implDir MyRemoteInterface.java ExtendsActivatable.java javac -d clientDir MyRemoteInterface.java Client.java
то, где implDir является целевым каталогом, чтобы поместить class реализации, регистрирует файлы class в, и clientDir является целевым каталогом, чтобы вставить файлы class клиента.
Setup программаКак только Ваша фаза реализации полна, Вы должны зарегистрировать информацию об объекте activatable, таким образом, клиент может использовать это. Setup программа, описанная учебным руководством Используя Активацию: Setup Программа, регистрирует дескриптор активации для объекта activatable с rmid, и затем связывает тупик удаленного объекта в rmiregistry так, чтобы клиенты могли искать это.
Работать Setup программа для этого примера, см., что раздел Запускается rmid, rmiregistry, и Setup программа в учебном руководстве по программе установки, которое описывает, как запустить rmid, rmiregistry, и Setup программа непосредственно.
После того, как Вы работаете rmid и rmiregistry как проинструктировано в Setup учебное руководство, Вы должны будете работать Setup программа, чтобы зарегистрировать дескриптор активации для activatable возражает, что реализует class examples.activation.ExtendsActivatable. Следующая командная строка работает Setup программа, предоставляя соответствующий файл URL для каждой кодовой базы использовала:
java -cp setupDir:implDir \
-Djava.security.policy=setup.policy \
-Djava.rmi.server.codebase=file:/implDir/ \
-Dexamples.activation.setup.codebase=file:/setupDir/ \
-Dexamples.activation.impl.codebase=file:/impDir/ \
-Dexamples.activation.name=examples.activation.MyRemoteInterface \
-Dexamples.activation.policy=group.policy \
examples.activation.Setup examples.activation.ExtendsActivatable
где:
Setup class программыSetup программаОтметьте что examples.activation.file системное свойство не должно быть определено, потому что ExtendsActivatable реализация class не использует это. Также отметьте, что у каждого файла URL выше есть необходимая запаздывающая наклонная черта. Примеры группы и файлов политики установки, подходящих для этого учебного руководства, описываются в учебном руководстве по установке, и также упоминаются ниже:
Вывод от Setup программа должна быть похожей на это:
Activation group descriptor registered. Activation descriptor registered. Stub bound in registry.
Как только Вы успешно зарегистрировали дескриптор активации для ExtendsActivatable реализация, можно выполнить клиентскую программу, которая, во время ее первого выполнения, вызовет объект activatable активироваться.
Следующая командная строка иллюстрирует, как выполнить клиентскую программу, определяя файл URL для клиентской кодовой базы:
java -cp clientDir \
-Djava.security.policy=client.policy \
-Dexamples.activation.client.codebase=file:/clientDir/ \
-Dexamples.activation.name=examples.activation.MyRemoteInterface \
examples.activation.Client [host]
где:
Примечания:
Setup программа. В этом примере мы использовали имя examples.activation.MyRemoteInterface.rmid и rmiregistry должен работать на узле сервера. Если узел сервера не является локальным узлом, параметр узла должен определить удаленный узел, на котором они работают.Вывод от клиента должен быть похожим на это:
Obtained stub from the registry. Invoking remote method... Returned from remote call. Result: hello there!