Spec-Zone .ru
спецификации, руководства, описания, API
|
Setup
ПрограммаЭто учебное руководство описывает, как записать программу, которая регистрирует дескриптор активации для удаленного объекта с JavaTM Удаленный Вызов метода (Java RMI) системный демон активации (rmid
) и затем связывает тупик для того удаленного объекта в rmiregistry
так, чтобы клиенты могли искать это.
У этого учебного руководства есть следующие шаги:
Setup
программаrmid
, rmiregistry
, и Setup
программаSetup.java
- основной Setup
программаsetup.policy
- файл политики безопасности для Setup
программаrmid.policy
- файл политики безопасности для rmid
group.policy
- файл политики безопасности для группы активацииSetup
программа Setup
программа, реализованная классом examples.activation.Setup
, регистрирует дескриптор активации в rmid
включать будущей активации объекта, определенного тем дескриптором активации. Эта программа не создает экземпляр удаленного объекта, но вместо этого регистрирует тупик удаленного объекта в rmiregistry
так, чтобы клиенты могли искать это. Это Setup
программа должна быть выполнена до выполнения любого из клиентов, описанных в других учебных руководствах по активации.
Setup
программа использует много системных свойств, чтобы настроить информацию, которая регистрируется в rmid
и rmiregistry
. Программа также берет единственный параметр командной строки, который определяет полностью определенное имя пакета класса реализации для activatable зарегистрированного удаленного объекта. Setup
программа выполняется следующим образом:
java -cp classpath \ -Djava.security.policy=setup.policy \ -Djava.rmi.server.codebase=codebase \ -Dexamples.activation.setup.codebase=setupCodebase \ -Dexamples.activation.impl.codebase=implCodebase \ -Dexamples.activation.name=name \ [-Dexamples.activation.file=filename] \ [-Dexamples.activation.policy=group.policy] \ examples.activation.Setup implClass
где:
Setup
программа и классы реализацииSetup
программаSetup
класс программы (используемый в предоставлении полномочий к Setup
программа в setup.policy файле)group.policy
), иСледующее является файлом политики в качестве примера для Setup
программа:
grant codeBase "${examples.activation.setup.codebase}" { // permissions to read system properties required by setup program permission java.util.PropertyPermission "examples.activation.impl.codebase","read"; permission java.util.PropertyPermission "examples.activation.policy","read"; permission java.util.PropertyPermission "examples.activation.file","read"; permission java.util.PropertyPermission "examples.activation.name","read"; // permission to connect to the activation system and the registry permission java.net.SocketPermission "*:1098-1099","connect"; };
Кодовой базой, которой предоставляют полномочия, является URL, определяющий расположение Setup
класс (ы) реализации программы. Этот URL является значением examples.activation.setup.codebase
системное свойство, которое определяется когда Setup
программа выполняется. Setup
программа нуждается в следующих полномочиях:
java.util.PropertyPermission
- считать различные системные свойства, требуемые Setup
программаjava.net.SocketPermission
- соединяться с системой активации (порт 1098
) зарегистрировать дескриптор активации, и соединиться с реестром (порт 1099
) связывать тупик activatable объекта с именемЕсть несколько шагов к записи этого Setup
программа:
rmiregistry
Setup
у класса есть помехи main
метод, который выполняет все вышеупомянутые шаги. Но прежде, чем сделать так, main
метод устанавливает a SecurityManager
и получает единственный параметр командной строки, который определяет полностью определенное имя пакета класса реализации для activatable удаленного объекта. Остальная часть шагов описывается ниже. См. Setup.java
для полного исходного кода.
Прежде, чем приложение регистрирует информацию об определенном activatable удаленном объекте, это сначала должно зарегистрировать информацию о группе активации, в которой будет содержаться объект. Группа активации является контейнерной виртуальной машиной (VM) для ряда activatable объекты. Каждая группа активации управляет выполнением одного или более объектов activatable. Групповой дескриптор активации содержит информацию, что система активации должна запустить групповой VM активации. Приложение может зарегистрировать групповой дескриптор активации в системе активации rmid
получить групповой ID активации, чтобы использовать для объекта activatable, или приложения может использовать групповой ID активации, полученный из предыдущей групповой регистрации.
Групповой дескриптор активации, экземпляр класса java.rmi.activation.ActivationGroupDesc
, может быть создан несколькими способами. Это учебное руководство использует двух конструкторов параметра ActivationGroupDesc(Properties,CommandEnvironment)
. Properties
карта содержит переопределения для системных свойств в группе активации VM. Для этого учебного руководства группа активации VM нуждается в следующих системных определенных свойствах:
java.security.policy
- файл политики безопасности группыjava.class.path
- фиктивный путь к классу, чтобы препятствовать тому, чтобы группа активации загрузила классы реализации из пути локального классаexamples.activation.impl.codebase
- расположение классов реализации, который использование файла политики группы предоставить полномочияexamples.activation.file
- файл containg постоянное состояние объекта java.security.policy
свойство определяется examples.activation.policy
системное свойство, и значения по умолчанию к файлу называют group.policy
который, практически, будет в рабочем каталоге где rmid
выполняется. java.class.path
свойство определяется как no_classpath
. examples.activation.impl.codebase
и examples.activation.file
свойства определяются их текущей стоимостью (соответственно), определяются когда Setup
выполнения программы.
Групповой дескриптор создается следующим образом:
String policy = System.getProperty("examples.activation.policy", "group.policy"); String implCodebase = System.getProperty("examples.activation.impl.codebase"); String filename = System.getProperty("examples.activation.file", ""); Properties props = new Properties(); props.put("java.security.policy", policy); props.put("java.class.path", "no_classpath"); props.put("examples.activation.impl.codebase", implCodebase); if (filename != null && !filename.equals("")) { props.put("examples.activation.file", filename); } ActivationGroupDesc groupDesc = new ActivationGroupDesc(props, null);
Следующее является примером group.policy
файл, который предоставляет соответствующие полномочия для примеров активации:
grant codeBase "${examples.activation.impl.codebase}" { // permission to read and write object's file permission java.io.FilePermission "${examples.activation.file}","read,write"; // permission to listen on an anonymous port permission java.net.SocketPermission "*:1024-","accept"; };
Кодовой базой, которой предоставляют полномочия, является URL, определяющий расположение классов реализации activatable объекта. Этот URL является значением examples.activation.impl.codebase
системное свойство, которое будет определено в групповом VM активации. Объект activatable в группе нуждается в двух полномочиях:
java.io.FilePermission
- считать и записать файл, содержащий постоянное состояние activatable объектаjava.net.SocketPermission
- чтобы экспортировать activatable возражают, чтобы принять соединения анонимный портSetup
программа должна зарегистрировать групповой дескриптор активации в системе активации, чтобы получить ID группы, экземпляр класса java.rmi.activation.ActivationGroupID
. Класс java.rmi.activation.ActivationGroup
имеет статический метод getSystem
для того, чтобы получить тупик для системы активации. Setup
программа вызывает удаленный метод системы активации registerGroup
, передача группового дескриптора, создаваемого выше, чтобы зарегистрировать группу активации: ActivationGroupID groupID = ActivationGroup.getSystem().registerGroup(groupDesc);
Как только групповой ID активации получается, Setup
программа может зарегистрировать дескриптор активации. У дескриптора активации есть четыре основных сведения:
В этом примере групповой ID активации является тем, полученным выше; имя класса реализации является именем класса, implClass, предоставленный как параметр командной строки Setup
программа; расположение (URL) определяется системным свойством examples.activation.impl.codebase
; и, данные инициализации (который является дополнительным) являются именем файла, определенным системным свойством examples.activation.file
.
Дескриптор активации создается следующим образом:
MarshalledObject data = null; if (filename != null && !filename.equals("")) { data = new MarshalledObject(filename); } ActivationDesc desc = new ActivationDesc(groupID, implClass, implCodebase, data);
Затем, Setup
программа должна зарегистрировать дескриптор активации в системе активации. Класс Activatable
имеет статический метод удобства, register
, это регистрирует дескриптор активации в системе активации и возвращает тупик для объекта activatable, определенного дескриптором.
Remote stub = Activatable.register(desc);
Отметьте: register
метод пытается загрузить тупиковый класс для класса реализации, чтобы создать тупиковый экземпляр. Если Ваш объект activatable должен поддерживать пред5.0 клиентов, Вы должны будете использовать rmic
предварительно генерировать тупиковый класс для класса реализации. Если Ваш объект activatable не должен поддерживать пред5.0 клиентов, то нет никакой потребности предварительно генерировать тупиковый класс для класса реализации. Если register
метод неспособен загрузить предварительно сгенерированный тупиковый класс, он будет использовать экземпляр динамически сгенерированного прокси-класса, который реализует все интерфейсы класса реализации. В последнем случае register
потребности метода загружают класс реализации, чтобы определить удаленные интерфейсы, которые реализует класс реализации. Так, register
у метода есть небольшое поведенческое различие, в зависимости от того, используется ли предварительно сгенерированный или динамически сгенерированный тупиковый класс.
rmiregistry
Наконец, тупик удаленного объекта связывается с именем в реестре, работающем на порту по умолчанию 1099
. Имя определяется системным свойством examples.activation.name
.
String name = System.getProperty("examples.activation.name"); LocateRegistry.getRegistry().rebind(name, stub);
Исходный файл для этого примера может быть скомпилирован следующим образом:
javac -d setupDir Setup.javaгде setupDir является корневым целевым каталогом, чтобы вставить файлы класса.
rmid
, rmiregistry
, и Setup
программаВыполнять это Setup
программа, Вы должны будете сделать следующее:
rmid
Запускаться rmid
, работайте rmid
команда на узле сервера. Эта команда не должна произвести вывод, если она выполняется с файлом политики безопасности как определено ниже. Для получения дополнительной информации см. документацию инструментов для rmid
[Солярис, Windows].
Например, в Операционной системе Соляриса:
rmid -J-Djava.security.policy=rmid.policy \ -J-Dexamples.activation.policy=group.policy &
Или, на платформах Windows:
start rmid -J-Djava.security.policy=rmid.policy \ -J-Dexamples.activation.policy=group.policy
где:
rmid
rmid
's файл политикиФайл политики безопасности для rmid
полномочия предоставлений для rmid
выполнить определенные команды и использовать определенные параметры командной строки в запускающейся группе активации VMs. Например, пользователь мог бы предоставить, что определенные полномочия запустили группу активации VM с одного или более системных свойств или другого java
параметры командной строки. Этот пример позволяет rmid
запустить группу активации VMs, которые определяют системные свойства java.security.policy
, java.class.path
, examples.activation.impl.codebase
, и examples.activation.file
. Следующий файл политики безопасности в качестве примера предоставляет, что разрешение запускает группу активации VM с этих определенных определенных свойств:
grant { // allow activation groups to use certain system properties permission com.sun.rmi.rmid.ExecOptionPermission "-Djava.security.policy=${examples.activation.policy}"; permission com.sun.rmi.rmid.ExecOptionPermission "-Djava.class.path=no_classpath"; permission com.sun.rmi.rmid.ExecOptionPermission "-Dexamples.activation.impl.codebase=*"; permission com.sun.rmi.rmid.ExecOptionPermission "-Dexamples.activation.file=*"; };
Первое ExecOptionPermission
предоставление разрешения ограничивает java.security.policy
системное свойство, чтобы быть файлом, определенным системным свойством examples.activation.policy
, определенный, когда rmid
выполняется. Следующее предоставление разрешения позволяет группе определять системное свойство java.class.path
как no_classpath
, фиктивный путь к классу, который препятствует тому, чтобы группа имела допустимый путь к классу. Следующее предоставление разрешения позволяет группе определять системное свойство examples.activation.impl.codebase
быть любым значением. Заключительное предоставление разрешения позволяет examples.activation.file
системное свойство, чтобы быть любым значением.
rmiregistry
Чтобы запустить реестр, работайте rmiregistry
команда на узле сервера. Эта команда не производит вывода (когда успешный), и обычно выполняется в фоновом режиме. Для получения дополнительной информации см. документацию инструментов для rmiregistry
[Солярис, Windows].
Например, в Операционной системе Соляриса:
rmiregistry &
Или, на платформах Windows:
start rmiregistry
По умолчанию реестр работает на порту TCP 1099. Чтобы запустить реестр на различном порту, определите номер порта из командной строки. Например, чтобы запустить реестр на порту 2001 на платформе Windows:
start rmiregistry 2001
Отметьте: Удостоверьтесь это rmiregistry
не имеет никаких классов реализации в ее пути к классу, чтобы препятствовать тому, чтобы это загрузило любые классы из своего пути локального класса.
Если реестр будет работать на порту кроме 1099, Вы должны будете определить номер порта в звонках LocateRegistry.getRegistry
в Setup
программа, так же как любые клиенты тот доступ этот реестр. Например, если реестр работает на порту 2001 в этом примере, звонке getRegistry
был бы:
Registry registry = LocateRegistry.getRegistry(2001);
Также отметьте это, если Вы используете порт реестра кроме 1099
, Вы должны будете также изменить Setup
и клиентские файлы политики программы, чтобы предоставить, что разрешение соединяется с портом реестра.
Setup
программаЗапускаться Setup
программа, выполненная Setup
класс используя java
команда следующим образом:
java -cp setupDir:implDir \ -Djava.security.policy=setup.policy \ -Djava.rmi.server.codebase=codebase \ -Dexamples.activation.setup.codebase=setupCodebase \ -Dexamples.activation.impl.codebase=implCodebase \ -Dexamples.activation.name=name \ [-Dexamples.activation.file=file] \ [-Dexamples.activation.policy=group.policy] \ examples.activation.Setup implClass
где:
Setup
класс программыSetup
программаSetup
класс программы (используемый в предоставлении полномочий к Setup
программа в setup.policy файле)data
в дескрипторе активации объекта (никакое значение по умолчанию)group.policy
), иОтметьте: Если Вы используете файл, URL для любой из упомянутых выше кодовых баз, удостоверяются, что каждый файл, у URL есть запаздывающая наклонная черта, или кодовая база, будет недопустим.
Вывод от Setup
программа должна быть похожей на это:
Activation group descriptor registered. Activation descriptor registered. Stub bound in registry.