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.