| 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.