CONTENTS | PREV | NEXT | Java Remote Method Invocation |
ActivationDesc
) can be registered in one of several
ways:
register
method of the class Activatable
,
orActivatable
class, orActivatable
's first or second
exportObject
method.ActivationDesc
ClassActivationDesc
contains
the information necessary to activate an object. It contains the
object's activation group identifier, the class name for the
object, a codebase path (or URLs) from which the object's code
can be loaded, and a MarshalledObject
that may contain
object-specific initialization data used during each activation.
A descriptor registered with the
activation system is consulted (during the activation process) to
obtain information in order to re-create or activate an object. The
MarshalledObject
in the object's descriptor is
passed as the second argument to the remote object's
constructor for the object to use during activation.
package java.rmi.activation;The first constructor for
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
constructs an object descriptor for an
object whose class is className, that can be loaded from
codebase path, and whose initialization information, in
marshalled form, is data. If this form of the constructor
is used, the object's group identifier defaults to the current
identifier for ActivationGroup
for this JVM. All
objects with the same ActivationGroupID
are activated
in the same JVM. If the current group is inactive an
ActivationException
is thrown. If the groupID
is null
, an IllegalArgumentException
is
thrown.
The second constructor for
ActivationDesc
constructs an object descriptor in the
same manner as the first constructor except an additional
parameter, restart, must be supplied. If the object
requires restart service, meaning that the object will be
restarted automatically when the activator is restarted (as opposed
to being activated lazily upon demand), restart should be
true
. If restart is false
, the
object is simply activated upon demand (via a remote method
call).
The third constructor for
ActivationDesc
constructs an object descriptor for an
object whose group identifier is groupID, whose class name
is className that can be loaded from the codebase
path, and whose initialization information is data. All
objects with the same groupID are activated in the same
JVM.
The fourth constructor for
ActivationDesc
constructs an object descriptor in the
same manner as the third constructor, but allows a restart mode to
be specified. If an object requires restart service (as defined
above), restart should be true
.
The getGroupID
method
returns the group identifier for the object specified by the
descriptor. A group provides a way to aggregate objects into a
single Java virtual machine.
The getClassName
method
returns the class name for the object specified by the activation
descriptor.
The getLocation
method
returns the codebase path from where the object's class can be
downloaded.
The getData
method
returns a "marshalled object" containing initialization
(activation) data for the object specified by the descriptor.
The getRestartMode
method returns true
if the restart mode is enabled for
this object, otherwise it returns false.
ActivationID
ClassActivationID
) contains several pieces of
information needed for activating an object:
An activation identifier for an object
can be obtained by registering an object with the activation
system. Registration is accomplished in a few ways (also noted
above):
Activatable.register
method, orActivatable
constructor, which both registers and
exports the object, orActivatable.exportObject
method, this method both
registers and exports the object.package java.rmi.activation;The constructor for
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
takes a single argument,
activator, that specifies a remote reference to the
activator responsible for activating the object associated with
this activation identifier. An instance of
ActivationID
is globally unique.
The activate
method
activates the object associated with the activation identifier. If
the force parameter is true, the activator considers any
cached reference for the remote object as stale, thus forcing the
activator to contact the group when activating the object. If
force is false, then returning the cached value is
acceptable. If activation fails, ActivationException
is thrown. If the object identifier is not known to the activator,
then the method throws UnknownObjectException
. If the
remote call to the activator fails, then
RemoteException
is thrown.
The equals
method
implements content equality. It returns true
if all
fields are equivalent (either identical or equivalent according to
each field's Object.equals
semantics). If
p1 and p2 are instances of the class
ActivationID
, the hashCode
method will
return the same value if p1.equals(p2)
returns
true
.
Activatable
ClassActivatable
class
provides support for remote objects that require persistent access
over time and that can be activated by the system. The class
Activatable
is the main API that developers need to
use to implement and manage activatable objects. Note that you must
first run the activation system daemon, rmid
, before
objects can be registered and/or activated.
package java.rmi.activation;An implementation for an activatable remote object may or may not extend the class
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
. A remote object implementation that
does extend the Activatable
class inherits
the appropriate definitions of the hashCode
and
equals
methods from the superclass
java.rmi.server.RemoteObject
. So, two remote object
references that refer to the same Activatable
remote
object will be equivalent (the equals
method will
return true). Also, an instance of the class
Activatable
will be "equals" to the
appropriate stub object for the instance (i.e., the
Object.equals
method will return true if
called with the matching stub object for the implementation as an
argument, and vice versa).
Activatable
class is used to register and export the
object on a specified port (an anonymous port is chosen if
port is zero). The object's URL path for downloading
its class code is codebase, and its initialization data is
data. If restart is true
, the object
will be restarted automatically when the activator is restarted and
if the group crashes. If restart is false
,
the object will be activated on demand (via a remote method call to
the object).
A concrete subclass of the
Activatable
class must call this constructor to
register and export the object during initial
construction. As a side-effect of activatable object construction,
the remote object is both "registered" with the activation
system and "exported" (on an anonymous port, if
port is zero) to the RMI runtime so that it is available
to accept incoming calls from clients.
The constructor throws
ActivationException
if registering the object with the
activation system fails. RemoteException
is thrown if
exporting the object to the RMI runtime fails.
The second constructor is the same
as the first Activatable
constructor but allows the
specification of the client and server socket factories used to
communicate with this activatable object. See the section in about
"RMI Socket Factories"
for details.
The third constructor is used to
activate and export the object (with the ActivationID
,
id) on a specified port. A concrete subclass of
the Activatable
class must call this constructor when
the object itself is activated via its special
"activation" constructor whose parameters must be:
RemoteException
if exporting the object to the RMI runtime fails.
The fourth constructor is the same as the third constructor, but allows the specification of the client and server socket factories used to communicate with this activatable object.
The getID
method
returns the object's activation identifier. The method is
protected so that only subclasses can obtain an object's
identifier. The object's identifier is used to report the
object as inactive or to unregister the object's activation
descriptor.
The register
method
registers, with the activation system, an object descriptor,
desc, for an activatable remote object so that it can be
activated on demand. This method is used to register an activatable
object without having to first create the object. This method
returns the Remote
stub for the activatable object so
that it can be saved and called at a later time thus forcing the
object to be created/activated for the first time. The method
throws UnknownGroupException
if the group identifier
in desc is not registered with the activation system.
ActivationException
is thrown if the activation system
is not running. Finally, RemoteException
is thrown if
the remote call to the activation system fails.
The inactive
method is
used to inform the system that the object with the corresponding
activation id is currently inactive. If the object is
currently known to be active, the object is unexported from the RMI
runtime (only if there are no pending or executing calls) so the
that it can no longer receive incoming calls. This call also
informs this JVM's ActivationGroup
that the object
is inactive; the group, in turn, informs its
ActivationMonitor
. If the call completes successfully,
subsequent activate requests to the activator will cause the object
to reactivate. The inactive
method returns
true
if the object was successfully unexported
(meaning that it had no pending or executing calls at the time) and
returns false
if the object could not be unexported
due to pending or in-progress calls. The method throws
UnknownObjectException
if the object is not known (it
may already be inactive); an ActivationException
is
thrown if the group is not active; a RemoteException
is thrown if the call informing the monitor fails. The operation
may still succeed if the object is considered active but has
already unexported itself.
The unregister
method
revokes previous registration for the activation descriptor
associated with id. An object can no longer be activated
via that id. If the object id is unknown to the
activation system, an UnknownObjectException
is
thrown. If the activation system is not running, an
ActivationException
is thrown. If the remote call to
the activation system fails, then a RemoteException
is
thrown.
The first exportObject
method may be invoked explicitly by an "activatable" object
that does not extend the Activatable
class, in order
to both
This exportObject
method returns the activation identifier obtained from registering
the descriptor, desc, with the activation system. If the
activation group is not active in the JVM, then
ActivationException
is thrown. If the object
registration or export fails, then RemoteException
is
thrown.
This method does not need to be
called if obj extends Activatable
, since the
first Activatable
constructor calls this method.
The second exportObject
method is the same as the first except it allows the specification
of client and server socket factories used to communicate with the
activatable object.
The third exportObject
method exports an "activatable" remote object (not
necessarily of type Activatable
) with the identifier,
id, to the RMI runtime to make the object, obj,
available to receive incoming calls. The object is exported on an
anonymous port, if port is zero.
During activation, this
exportObject
method should be invoked explicitly by an
"activatable" object, that does not extend the
Activatable
class. There is no need for objects that
do extend the Activatable
class to invoke this method
directly; this method is called by the third constructor above
(which a subclass should invoke from its special activation
constructor).
This exportObject
method returns the Remote
stub for the activatable
object. If the object export fails, then the method throws
RemoteException
.
The fourth exportObject
method is the same as the third but allows the specification of the
client and server socket factories used to communicate with this
activatable object.
The unexportObject
method makes the remote object, obj, unavailable for
incoming calls. If the force parameter is true
, the
object is forcibly unexported even if there are pending calls to
the remote object or the remote object still has calls in progress.
If the force parameter is false
, the object is only
unexported if there are no pending or in progress calls to the
object. If the object is successfully unexported, the RMI runtime
removes the object from its internal tables. Removing the object
from RMI use in this forcible manner may leave clients holding
stale remote references to the remote object. This method throws
java.rmi.NoSuchObjectException
if the object was not
previously exported to the RMI runtime.
Activatable
class) must define a
special public constructor that takes two arguments, its activation
identifier of type ActivationID
, and its activation
data, a java.rmi.MarshalledObject
, supplied in the
activation descriptor used during registration. When an activation
group activates a remote object inside its JVM, it constructs the
object via this special constructor (described in more detail
below). The remote object implementation may use the activation
data to initialize itself in a suitable manner. The remote object
may also wish to retain its activation identifier, so that it can
inform the activation group when it becomes inactive (via a call to
the Activatable.
inactive
method).
The first and second constructor
forms for Activatable
are used to both register and
export an activatable object on a specified port. This
constructor should be used when initially constructing the object;
the third form of the constructor is used when re-activating the
object.
A concrete subclass of
Activatable
must call the first or second constructor
form to register and export the object during initial construction.
This constructor first creates an activation descriptor
(ActivationDesc
) with the object's class name, the
object's supplied codebase and data, and
whose activation group is the default group for the JVM. Next, the
constructor registers this descriptor with the default
ActivationSystem
. Finally, the constructor exports the
activatable object to the RMI runtime on the specific port
(if port is zero, then an anonymous port is chosen) and
reports the object as an activeObject
to the local
ActivationGroup
. If an error occurs during
registration or export, the constructor throws
RemoteException
. Note that the constructor also
initializes its ActivationID
(obtained via
registration), so that subsequent calls to the protected method
getID
will return the object's activation
identifier.
The third constructor form for
Activatable
is used to export the object on a
specified port. A concrete subclass of Activatable
must call the third constructor form when it is activated via the
object's own "activation" constructor, which takes two
arguments:
ActivationGroup
that the object is
active, since it is the ActivationGroup
that is
activating the object and knows it to be active already.
The following is an example of a
remote object interface, Server
, and an
implementation, ServerImpl
, that extends the
Activatable
class:
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() { ... } }An object is responsible for exporting itself. The constructors for
Activatable
take care of
exporting the object to the RMI runtime with the live
reference type of a UnicastRemoteObject
, so the object
implementation extending Activatable
does not need to
worry about the detail of exporting the object explicitly (other
than invoking the appropriate superclasses constructor). If an
object implementation does not extend the class
Activatable
, the object must export the object
explicitly via a call to one of the
Activatable.exportObject
static methods.
In the following example,
ServerImpl
does not extend
Activatable
, but rather another class, so
ServerImpl
is responsible for exporting itself during
initial construction and activation. The following class definition
shows ServerImpl
's initialization constructor and
its special "activation" constructor and the appropriate
call to export the object within each constructor:
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() { ... } }
ActivationDesc
) for the
object. An activation descriptor contains all the necessary
information so that the activation system can activate the object
when needed. An activation descriptor for an instance of the class
examples.ServerImpl
can be registered in the following
manner (exception handling elided):
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);
The register
call
returns a Remote
stub that is the stub for the
examples.ServerImpl
object and implements the same set
of remote interfaces that examples.ServerImpl
implements (i.e, the stub implements the remote interface
Server
). This stub object (above, cast and assigned to
server) can be passed as a parameter in any method call
expecting an object that implements the
examples.Server
remote interface.