Spec-Zone .ru
спецификации, руководства, описания, API
СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT Java Удаленный Вызов метода


7.3 Модель реализации для Удаленного объекта "Activatable"

Чтобы сделать удаленный объект, к которому можно получить доступ через идентификатор активации в течение долгого времени, разработчик нуждается к: Дескриптор активации (ActivationDesc) может быть зарегистрирован одним из нескольких способов: Для конкретной цели только один из вышеупомянутых методов должен использоваться, чтобы зарегистрировать объект для активации. См. раздел ниже по "Построению Удаленного объекта Activatable" для примеров на том, как реализовать объекты activatable.


7.3.1 ActivationDesc Класс

ActivationDesc содержит информацию, необходимую, чтобы активировать объект. Это содержит групповой идентификатор активации объекта, имя класса для объекта, путь кодовой базы (или URL), из которого код объекта может быть загружен, и a MarshalledObject это может содержать объектно-специфичные данные инициализации, используемые во время каждой активации.

С дескриптором, зарегистрированным в системе активации, консультируются (во время процесса активации), чтобы получить информацию, чтобы воссоздать или активировать объект. MarshalledObject в дескрипторе объекта передается как второй параметр конструктору удаленного объекта для объекта использовать во время активации.

package java.rmi.activation;
public final class ActivationDesc implements java.io.Serializable { public ActivationDesc(String className, String codebase, java.rmi.MarshalledObject data) throws ActivationException; public ActivationDesc(String className, String codebase, java.rmi.MarshalledObject data, boolean restart) throws ActivationException; public ActivationDesc(ActivationGroupID groupID, String className, String codebase, java.rmi.MarshalledObject data, boolean restart); public ActivationDesc(ActivationGroupID groupID, String className, String codebase, java.rmi.MarshalledObject data); public ActivationGroupID getGroupID(); public String getClassName(); public String getLocation(); public java.rmi.MarshalledObject getData() public boolean getRestartMode(); }
Первый конструктор для ActivationDesc создает объектный дескриптор для объекта, класс которого является именем класса, которое может быть загружено из пути кодовой базы, и чья информацией об инициализации, в упорядоченной форме, являются данные. Если эта форма конструктора используется, групповые значения по умолчанию идентификатора объекта к текущему идентификатору для ActivationGroup для этой JVM. Все объекты с тем же самым ActivationGroupID активируются в той же самой JVM. Если текущая группа неактивна ActivationException бросается. Если groupID null, IllegalArgumentException бросается.

Второй конструктор для ActivationDesc создает объектный дескриптор тем же самым способом, как первый конструктор кроме дополнительного параметра, перезапуска, должен быть предоставлен. Если объект требует службы перезапуска, означая, что объект будет перезапущен автоматически, когда активатор будет перезапущен (в противоположность тому, чтобы быть активированным лениво по требованию), перезапуск должен быть true. Если перезапуск false, объект просто активируется по требованию (через удаленный вызов метода).

Третий конструктор для ActivationDesc создает объектный дескриптор для объекта, групповой идентификатор которого является groupID, имя класса которого является именем класса, которое может быть загружено из пути кодовой базы, и чья информацией об инициализации являются данные. Все объекты с тем же самым groupID активируются в той же самой JVM.

Четвертый конструктор для ActivationDesc создает объектный дескриптор тем же самым способом как третий конструктор, но позволяет режиму перезапуска быть определенным. Если объект требует службы перезапуска (как определено выше), перезапуск должен быть true.

getGroupID метод возвращает групповой идентификатор для объекта, определенного дескриптором. Группа обеспечивает способ агрегировать объекты в единственную виртуальную машину Java.

getClassName метод возвращает имя класса для объекта, определенного дескриптором активации.

getLocation метод возвращает путь кодовой базы из того, где класс объекта может быть загружен.

getData метод возвращает "упорядоченный объект", содержащий инициализацию (активация) данные для объекта, определенного дескриптором.

getRestartMode возвраты метода true если режим перезапуска включается для этого объекта, иначе это возвращает false.


7.3.2 ActivationID Класс

Протокол активации использует идентификаторы активации, чтобы обозначить удаленные объекты, которые могут быть активированы в течение долгого времени. Идентификатор активации (экземпляр класса ActivationID) содержит несколько сведений, необходимых для того, чтобы активировать объект: Идентификатор активации для объекта может быть получен, регистрируя объект с системой активации. Регистрация выполняется несколькими способами (также отмеченный выше):
package java.rmi.activation;
public class ActivationID implements java.io.Serializable { public ActivationID(Activator activator); public Remote activate(boolean force) throws ActivationException, UnknownObjectException, java.rmi.RemoteException; public boolean equals(Object obj); public int hashCode(); }
Конструктор для ActivationID берет единственный параметр, активатор, который определяет удаленную ссылку на активатор, ответственный за активирование объекта, связанного с этим идентификатором активации. Экземпляр ActivationID глобально уникально.

activate метод активирует объект, связанный с идентификатором активации. Если параметр силы является истиной, активатор рассматривает любую кэшируемую ссылку для удаленного объекта как устарелую, таким образом вынуждая активатор связаться с группой, активируя объект. Если сила является ложью, то возврат кэшируемого значения является приемлемым. Если активация перестала работать, ActivationException бросается. Если объектный идентификатор не известен активатору, то метод бросает UnknownObjectException. Если удаленный звонок в сбои активатора, то RemoteException бросается.

equals метод реализует равенство контента. Это возвращается true если все поля эквивалентны (или идентичный или эквивалентный согласно каждому полю Object.equals семантика). Если p1 и p2 являются экземплярами класса ActivationID, hashCode метод возвратит то же самое значение если p1.equals(p2) возвраты true.


7.3.3 Activatable Класс

Activatable класс оказывает поддержку для удаленных объектов, которые требуют персистентного доступа в течение долгого времени, и это может быть активировано системой. Класс Activatable основной API, который разработчики должны использовать, чтобы реализовать и управлять объектами activatable. Отметьте, что Вы должны первый показ системный демон активации, rmid, прежде, чем объекты могут быть зарегистрированы и/или активированы.

package java.rmi.activation;
public abstract class Activatable extends java.rmi.server.RemoteServer { protected Activatable(String codebase, java.rmi.MarshalledObject data, boolean restart, int port) throws ActivationException, java.rmi.RemoteException; protected Activatable(String codebase, java.rmi.MarshalledObject data, boolean restart, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws ActivationException, java.rmi.RemoteException; protected Activatable(ActivationID id, int port) throws java.rmi.RemoteException; protected Activatable(ActivationID id, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws java.rmi.RemoteException; protected ActivationID getID(); public static Remote register(ActivationDesc desc) throws UnknownGroupException, ActivationException, java.rmi.RemoteException; public static boolean inactive(ActivationID id) throws UnknownObjectException, ActivationException, java.rmi.RemoteException; public static void unregister(ActivationID id) throws UnknownObjectException, ActivationException, java.rmi.RemoteException; public static ActivationID exportObject(Remote obj, String codebase, MarshalledObject data, boolean restart, int port) throws ActivationException, java.rmi.RemoteException; public static ActivationID exportObject(Remote obj, String codebase, MarshalledObject data, boolean restart, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws ActivationException, java.rmi.RemoteException; public static Remote exportObject(Remote obj, ActivationID id, int port) throws java.rmi.RemoteException; public static Remote exportObject(Remote obj, ActivationID id, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws java.rmi.RemoteException; public static boolean unexportObject(Remote obj, boolean force) throws java.rmi.NoSuchObjectException; }
Реализация для activatable удаленного объекта может или, возможно, не расширяет класс Activatable. Реализация удаленного объекта, которая действительно расширяется Activatable класс наследовал соответствующие определения hashCode и equals методы от суперкласса java.rmi.server.RemoteObject. Так, две ссылки удаленного объекта, которые обращаются к тому же самому Activatable удаленный объект будет эквивалентен ( equals метод возвратит true). Кроме того, экземпляр класса Activatable будет "равняется" соответствующему тупиковому объекту для экземпляра (то есть, Object.equals метод возвратит true если вызвано с соответствующим тупиковым объектом для реализации как параметр, и наоборот).


Методы Класса Activatable

Первый конструктор для Activatable класс используется, чтобы зарегистрировать и экспортировать объект на указанном порту (анонимный порт выбирается, если порт является нулем). Путь URL объекта для того, чтобы загрузить его код класса является кодовой базой, и его данные инициализации являются данными. Если перезапуск true, объект будет перезапущен автоматически, когда активатор будет перезапущен и если группа отказывает. Если перезапуск false, объект будет активирован по требованию (через удаленный вызов метода объекта).

Конкретный подкласс Activatable класс должен вызвать этого конструктора, чтобы зарегистрировать и экспортировать объект во время начальной конструкции. Как побочный эффект конструкции объекта activatable, удаленный объект и "регистрируется" в системе активации и "экспортируется" (на анонимном порту, если порт является нулем) ко времени выполнения RMI так, чтобы это было доступно, чтобы принять входящие вызовы от клиентов.

Броски конструктора ActivationException регистрируя объект в системных сбоях активации. RemoteException бросается, экспортируя объект в сбои времени выполнения RMI.

Второй конструктор является тем же самым как первым Activatable конструктор, но позволяет спецификацию фабрик сокета клиента и сервера, используемых, чтобы связаться с этим объектом activatable. См. раздел в приблизительно "Фабриках Сокета RMI" для деталей.

Третий конструктор используется, чтобы активировать и экспортировать объект (с ActivationID, идентификатор) на указанном порту. Конкретный подкласс Activatable класс должен вызвать этого конструктора, когда сам объект активируется через его специального конструктора "активации", параметры которого должны быть:

Как побочный эффект конструкции, удаленный объект "экспортируется" во время выполнения RMI (на указанном порту) и доступен, чтобы принять входящие вызовы от клиентов. Броски конструктора RemoteException экспортируя объект в сбои времени выполнения RMI.

Четвертый конструктор является тем же самым как третий конструктор, но позволяет спецификацию фабрик сокета клиента и сервера, используемых, чтобы связаться с этим объектом activatable.

getID метод возвращает идентификатор активации объекта. Метод защищается так, чтобы только подклассы могли получить идентификатор объекта. Идентификатор объекта используется, чтобы сообщить об объекте как неактивном или незарегистрировать дескриптор активации объекта.

register регистры метода, с системой активации, объектным дескриптором, desc, для activatable удаленного объекта так, чтобы это могло быть активировано по требованию. Этот метод используется, чтобы зарегистрировать объект activatable, не имея необходимость сначала создавать объект. Этот метод возвращается Remote тупик для объекта activatable так, чтобы это могло быть сохранено и вызвано в более позднее время, таким образом вынуждая объект быть созданным/активированным впервые. Броски метода UnknownGroupException если групповой идентификатор в desc не регистрируется в системе активации. ActivationException бросается, если система активации не работает. Наконец, RemoteException бросается, если удаленный звонок в систему активации перестал работать.

inactive метод используется, чтобы сообщить системе, что объект с соответствующим идентификатором активации в настоящий момент неактивен. Если объект, как в настоящий момент известно, является активным, объект неэкспортируется со времени выполнения RMI (только если нет никакого ожидания или выполнения вызовов) так, что это больше не может получить входящие вызовы. Этот вызов также сообщает этой JVM ActivationGroup то, что объект неактивен; группа, поочередно, сообщает ActivationMonitor. Если вызов завершается успешно, последующий активируются, запросы к активатору вызовут объект оживить. inactive возвраты метода true если объект успешно неэкспортировался (подразумевать, что у него не было никакого ожидания или выполнения вызовов в это время), и возвраты false если объект не мог бы быть неэкспортирован из-за ожидания, или происходящий вызывает. Броски метода UnknownObjectException если объект не известен (это может уже быть неактивно); ActivationException бросается, если группа не активна; a RemoteException бросается, если вызов, сообщающий монитору, перестал работать. Работа может все еще успешно выполниться, если объект считают активным, но уже неэкспортировал себя.

unregister метод отменяет предыдущую регистрацию для дескриптора активации, связанного с идентификатором. Объект больше не может быть активирован через тот идентификатор. Если объектный идентификатор неизвестен системе активации, UnknownObjectException бросается. Если система активации не работает, ActivationException бросается. Если удаленный звонок в системные сбои активации, то a RemoteException бросается.

Первое exportObject метод может быть вызван явно объектом "activatable", который не расширяется Activatable класс, чтобы обоим

Как только объект экспортируется, он может получить входящие вызовы RMI.

Это exportObject метод возвращает идентификатор активации, полученный из регистрации дескриптора, desc, с системой активации. Если группа активации не активна в JVM, то ActivationException бросается. Если объектная регистрация или сбои экспорта, то RemoteException бросается.

Этот метод не должны вызвать, если obj расширяется Activatable, начиная с первого Activatable конструктор вызывает этот метод.

Второе exportObject метод является тем же самым, поскольку первое кроме этого позволяет спецификацию фабрик сокета клиента и сервера, используемых, чтобы связаться с объектом activatable.

Третье exportObject метод экспортирует "activatable" удаленный объект (не обязательно типа Activatable) с идентификатором, идентификатором, ко времени выполнения RMI, чтобы сделать объект, obj, доступный, чтобы получить входящие вызовы. Объект экспортируется на анонимном порту, если порт является нулем.

Во время активации, этого exportObject метод должен быть вызван явно объектом "activatable", который не расширяется Activatable класс. Нет никакой потребности в объектах, которые действительно расширяются Activatable класс, чтобы вызвать этот метод непосредственно; этот метод вызывает третий конструктор выше (который подкласс должен вызвать от его специального конструктора активации).

Это exportObject метод возвращается Remote тупик для объекта activatable. Если объектный экспорт перестал работать, то метод бросает RemoteException.

Четвертое exportObject метод является тем же самым как третьим, но позволяет спецификацию фабрик сокета клиента и сервера, используемых, чтобы связаться с этим объектом activatable.

unexportObject метод делает удаленный объект, obj, недоступным входящим вызовам. Если параметр силы true, объект насильственно неэкспортируется, даже если там ожидают, призывает к удаленному объекту, или у удаленного объекта все еще есть происходящие вызовы. Если параметр силы false, объект только неэкспортируется, если нет никакого ожидания, или происходящий призывает к объекту. Если объект успешно неэкспортируется, время выполнения RMI удаляет объект из своих внутренних таблиц. Удаление объекта от использования RMI этим насильственным способом может оставить клиенты, содержащие устарелые удаленные ссылки на удаленный объект. Этот метод броски java.rmi.NoSuchObjectException если объект ранее не экспортировался во время выполнения RMI.


Построение Удаленного объекта Activatable

Для объекта, который будет активирован, "activatable" возражают классу реализации (расширяется ли он Activatable класс), должен определить специального общедоступного конструктора, который берет два параметра, его идентификатор активации типа ActivationID, и его данные активации, a java.rmi.MarshalledObject, предоставленный в дескрипторе активации используется во время регистрации. Когда группа активации активирует удаленный объект в своей JVM, она создает объект через этого специального конструктора (описанный более подробно ниже). Реализация удаленного объекта может использовать данные активации, чтобы инициализировать себя подходящим способом. Удаленный объект может также хотеть сохранить свой идентификатор активации, так, чтобы он мог сообщить группе активации, когда это становится неактивным (через звонок Activatable.inactive метод).

Первый и второй конструктор формируется для Activatable используются, чтобы и зарегистрировать и экспортировать объект activatable на указанном порту. Этот конструктор должен использоваться, первоначально создавая объект; третья форма конструктора используется, оживляя объект.

Конкретный подкласс Activatable должен вызвать первую или вторую форму конструктора, чтобы зарегистрировать и экспортировать объект во время начальной конструкции. Этот конструктор сначала создает дескриптор активации (ActivationDesc) с именем класса объекта, предоставленной кодовой базой объекта и данными, и чья группа активации является группой по умолчанию для JVM. Затем, конструктор регистрирует этот дескриптор в значении по умолчанию ActivationSystem. Наконец, конструктор экспортирует объект activatable во время выполнения RMI на определенном порту (если порт является нулем, то анонимный порт выбирается), и сообщает об объекте как activeObject к локальной переменной ActivationGroup. Если ошибка происходит во время регистрации или экспорта, бросков конструктора RemoteException. Отметьте, что конструктор также инициализирует ActivationID (полученный через регистрацию), так, чтобы последующие звонки в защищенный метод getID возвратит идентификатор активации объекта.

Третий конструктор формируется для Activatable используется, чтобы экспортировать объект на указанном порту. Конкретный подкласс Activatable должен вызвать третью форму конструктора, когда она активируется через собственного конструктора "активации" объекта, который берет два параметра:

Этот конструктор только экспортирует объект activatable во время выполнения RMI на определенном порту (если порт 0, то анонимный порт выбирается). Это не сообщает ActivationGroup то, что объект является активным, так как это ActivationGroup это активирует объект и знает, что это уже активно.

Следующее является примером интерфейса удаленного объекта, Server, и реализация, ServerImpl, это расширяется Activatable класс:

package examples;

public interface Server extends java.rmi.Remote {
        public void doImportantStuff() 
                throws java.rmi.RemoteException;
}

public class ServerImpl extends Activatable implements Server
{
        // Constructor for initial construction, registration and export
        public ServerImpl(String codebase, MarshalledObject data) 
                throws ActivationException, java.rmi.RemoteException
        {
                // register object with activation system, then
                // export on anonymous port
                super(codebase, data, false, 0);
        }

        // Constructor for activation and export; this constructor
        // is called by the ActivationInstantiator.newInstance
        // method during activation in order to construct the object.
        public ServerImpl(ActivationID id, MarshalledObject data) 
                throws java.rmi.RemoteException
        {
                // call the superclass's constructor in order to
                // export the object to the RMI runtime.
                super(id, 0);
                // initialize object (using data, for example)
        }

        public void doImportantStuff() { ... }
}
Объект ответственен за экспорт себя. Конструкторы для Activatable заботьтесь об экспорте объекта ко времени выполнения RMI с живым ссылочным типом a UnicastRemoteObject, так объектное расширение реализации Activatable не должен волноваться о детали экспорта объекта явно (кроме вызова соответствующего конструктора суперклассов). Если объектная реализация не расширяет класс Activatable, объект должен экспортировать объект явно через звонок в один из Activatable.exportObject статические методы.

В следующем примере, ServerImpl не расширяется Activatable, а скорее другой класс, таким образом, ServerImpl ответственно за экспорт себя во время начальной конструкции и активации. Следующие шоу определения класса ServerImpl's конструктор инициализации и ее специальный конструктор "активации" и соответствующий вызов, чтобы экспортировать объект в пределах каждого конструктора:

package examples;
public class ServerImpl extends SomeClass implements Server { // constructor for initial creation public ServerImpl(String codebase, MarshalledObject data) throws ActivationException, java.rmi.RemoteException { // register and export the object Activatable.exportObject(this, codebase, data, false, 0); } // constructor for activation public ServerImpl(ActivationID id, MarshalledObject data) throws java.rmi.RemoteException { // export the object Activatable.exportObject(this, id, 0); } public void doImportantStuff() { ... } }


Регистрация Дескриптора Активации, Не Создавая Объект

Чтобы зарегистрировать activatable удаленный объект в системе активации без первого создания объекта, программист может просто зарегистрировать дескриптор активации (экземпляр класса ActivationDesc) для объекта. Дескриптор активации содержит всю необходимую информацию так, чтобы система активации могла активировать объект при необходимости. Дескриптор активации для экземпляра класса examples.ServerImpl может быть зарегистрирован следующим способом (игнорируемая обработка исключений):

Server server;
ActivationDesc desc;
String codebase = "http://zaphod/codebase/";

MarshalledObject data = new MarshalledObject("some data");
desc = new ActivationDesc( "examples.ServerImpl", codebase, data);
server = (Server)Activatable.register(desc);

register вызовите возвраты a Remote тупик, который является тупиком для examples.ServerImpl объект и реализации тот же самый набор удаленных интерфейсов это examples.ServerImpl реализации (то есть, тупик реализует удаленный интерфейс Server). Этот тупиковый объект (выше, бросок и присвоенный серверу) можно передать в качестве параметра в любом вызове метода, ожидая объект, который реализует examples.Server удаленный интерфейс.



СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT
Copyright 1997, 2010, Oracle и/или его филиалы. Все права защищены.