Distributed object systems are designed
to support long-lived persistent objects. Given that these systems
will be made up of many thousands (perhaps millions) of such
objects, it would be unreasonable for object implementations to
become active and remain active, taking up valuable system
resources, for indefinite periods of time. In addition, clients
need the ability to store persistent references to objects so that
communication among objects can be re-established after a system
crash, since typically a reference to a distributed object is valid
only while the object is active.
Object activation is a mechanism for
providing persistent references to objects and managing the
execution of object implementations. In RMI, activation allows
objects to begin execution on an as-needed basis. When an
activatable remote object is accessed (via a method
invocation) if that remote object is not currently executing, the
system initiates the object's execution inside an appropriate
JVM.
7.1.1 Terminology
An active object is a remote
object that is instantiated and exported in a JVM on some system. A
passive object is one that is not yet instantiated (or
exported) in a JVM, but which can be brought into an active state.
Transforming a passive object into an active object is a process
known as activation. Activation requires that an object be
associated with a JVM, which may entail loading the class for that
object into a JVM and the object restoring its persistent state (if
any).
In the RMI system, we use lazy
activation. Lazy activation defers activating an object until
a client's first use (i.e., the first method invocation).
7.1.2 Lazy Activation
Lazy activation of remote objects is
implemented using a faulting remote reference (sometimes
referred to as a fault block). A faulting remote reference to a
remote object "faults in" the active object's reference
upon the first method invocation to the object. Each faulting
reference maintains both a persistent handle (an activation
identifier) and a transient remote reference to the target remote
object. The remote object's activation identifier contains
enough information to engage a third party in activating the
object. The transient reference is the actual "live"
reference to the active remote object that can be used to contact
the executing object.
In a faulting reference, if the live
reference to a remote object is null
, the target
object is not known to be active. Upon method invocation, the
faulting reference (for that object) engages in the activation
protocol to obtain a "live" reference, which is a remote
reference (such as a unicast remote reference) for the
newly-activated object. Once the faulting reference obtains the
live reference, the faulting reference forwards method invocations
to the underlying remote reference which, in turn, forwards the
method invocation to the remote object.
In more concrete terms, a remote
object's stub contains a "faulting" remote reference
type that contains both:
- an activation identifier for a
remote object, and
- a "live" reference
(possibly
null
) containing the "active" remote
reference type of the remote object (for example, a remote
reference type with unicast semantics).
Note - The RMI system preserves "at
most once" semantics for remote calls. In other words, a call
to an activatable or unicast remote object is
sent at most once. Thus, if a call to a remote object fails
(indicated by a RemoteException
being thrown), the
client can be guaranteed that the remote method executed no more
than once (and perhaps not at all).
CONTENTS | PREV | NEXT
Copyright 1997, 2010, Oracle and/or its affiliates. All rights
reserved.