9b044d1951
From-SVN: r104578
232 lines
13 KiB
HTML
232 lines
13 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
|
<!-- package.html - describes classes in org.omg.PortableServer package
|
|
Copyright (C) 2005 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Classpath.
|
|
|
|
GNU Classpath is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
GNU Classpath is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GNU Classpath; see the file COPYING. If not, write to the
|
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301 USA.
|
|
|
|
Linking this library statically or dynamically with other modules is
|
|
making a combined work based on this library. Thus, the terms and
|
|
conditions of the GNU General Public License cover the whole
|
|
combination.
|
|
|
|
As a special exception, the copyright holders of this library give you
|
|
permission to link this library with independent modules to produce an
|
|
executable, regardless of the license terms of these independent
|
|
modules, and to copy and distribute the resulting executable under
|
|
terms of your choice, provided that you also meet, for each linked
|
|
independent module, the terms and conditions of the license of that
|
|
module. An independent module is a module which is not derived from
|
|
or based on this library. If you modify this library, you may extend
|
|
this exception to your version of the library, but you are not
|
|
obligated to do so. If you do not wish to do so, delete this
|
|
exception statement from your version. -->
|
|
|
|
<html>
|
|
<head><title>GNU Classpath - The Portable Object Adapter package</title></head>
|
|
<body>
|
|
<p>
|
|
The Portable Object Adapter (POA) provides more control on the request
|
|
processing than it is possible when connecting objects directly to the
|
|
ORB. The POA model defines a tree structure of POAs, the root POA being
|
|
connected directly to the ORB. Any branch of this tree can be temporary or
|
|
permanently inactivated using {@link org.omg.PortableServer.POAManager}.
|
|
The same manager can control several branches in the POA tree. Also,
|
|
any branch in this tree can have different processing options (policies).
|
|
</p><p>
|
|
The newly created POA is in holding state, just queuing requests. To start
|
|
processing requests, it must be turned into the active state by its
|
|
{@link org.omg.PortableServer.POAManagerOperations#activate}.
|
|
</p><p>
|
|
The previously monolite object implementation is now divided into object
|
|
(that implements {@link org.omg.CORBA.Object})
|
|
and servant (that implements either {@link org.omg.CORBA.portable.InvokeHandler}
|
|
or {@link org.omg.PortableServer.DynamicImplementation}).
|
|
Frequently each object has its own servant, but it can also be a single servant
|
|
per multiple objects and also default servant for POA
|
|
(see {@link org.omg.PortableServer.POAOperations#set_servant}). Each object
|
|
has its own Object Id, unique in the scope of the POA, where the object is
|
|
connected. These Ids need not be different for objects belonging
|
|
to different POAs, even if these POAs are connected to the same ORB.
|
|
Under the USER_ID is assignment policy this Id can be a specified by user in
|
|
{@link org.omg.PortableServer.POAOperations#activate_object_with_id},
|
|
encapsulating some meaningful information about the object. The Id of the
|
|
object being currently served can be identified with
|
|
{@link org.omg.PortableServer.Servant#_object_id}. This approach is used in cases
|
|
when it is possible to encapsulate all object-related data into the
|
|
Object Id. Such system only needs one servant, one server socket and one
|
|
socket port per POA that can handle thounsands of objects.
|
|
</p><p>
|
|
Instead of being connected directly to the ORB, objects are now connected
|
|
to one of the ORBs POAs. Since JDK 1.4 the application specific implementation
|
|
base is derived from the {@link org.omg.PortableServer.Servant}, having a
|
|
different name pattern (<code>*POA.java</code> instead of the previous
|
|
<code>_*ImplBase.java</code>). This <code>*POA</code> suffix does <i>not</i>
|
|
mean that these servants implement or are derived from POA. They are different
|
|
classes that can be connected to one of the POAs, by instance, using
|
|
{@link org.omg.PortableServer.POAOperations#servant_to_reference}.
|
|
The implementation base also inherits an *Operations interface, containing
|
|
definitions of the application specific methods. The application programmer
|
|
writes a descendent of the implementation base, implementing these methods
|
|
for the application - specific functionality.
|
|
</p><p>
|
|
The POA objects support the method invocation by name, using
|
|
{@link org.omg.CORBA.Request}. This alternative method works without the
|
|
service-specific classes that may not be available at run time.
|
|
</p><p>
|
|
The objects in POA can also be activated and inactivated independently. It
|
|
is possible to set a listener ({@link org.omg.PortableServer.ServantActivator})
|
|
that would register the object activations ("incarnations") and deactivations
|
|
("etherializations"). The servant need not be specifyed when creating an
|
|
object. Under the IMPLICIT_ACTIVATION
|
|
{@link org.omg.PortableServer.ImplicitActivationPolicy}
|
|
the {@link org.omg.PortableServer.ServantActivator} can provide the servant
|
|
in response to the first (local or remote) call of any method on the
|
|
previously incative object.
|
|
</p><p>
|
|
The root POA is obtained by resolving the initial reference "RootPOA"
|
|
for the orb. In the simpliest case the objects can be connected directly
|
|
to that root POA without creating the POA tree. The policies, used by
|
|
the root POA, are defined by OMG as following:
|
|
<table border="1">
|
|
<tr><th>Policy type</th><th>Accepted policy</th></tr>
|
|
<tr><td>{@link org.omg.PortableServer.IdAssignmentPolicy} </td><td>SYSTEM_ID
|
|
(Ids are created by POA)</td></tr>
|
|
<tr><td>{@link org.omg.PortableServer.IdUniquenessPolicy}</td><td>UNIQUE_ID
|
|
(single object (and Id) per servant)
|
|
</td></tr>
|
|
<tr><td>{@link org.omg.PortableServer.ImplicitActivationPolicy} </td><td>
|
|
IMPLICIT_ACTIVATION (if inactive, activate)</td></tr>
|
|
<tr><td>{@link org.omg.PortableServer.LifespanPolicy} </td><td>TRANSIENT
|
|
(the POA objects cannot outlive POA)</td></tr>
|
|
<tr><td>{@link org.omg.PortableServer.RequestProcessingPolicy} </td><td>
|
|
USE_ACTIVE_OBJECT_MAP_ONLY (the servant is provided during activation)</td></tr>
|
|
<tr><td>{@link org.omg.PortableServer.ServantRetentionPolicy} </td><td>
|
|
RETAIN (retain servants for subsequent invocations)</td></tr>
|
|
<tr><td>{@link org.omg.PortableServer.ThreadPolicy} </td><td>ORB_CTRL_MODEL
|
|
(single thread per request and single server socket per object)</td></tr>
|
|
</table>
|
|
These values are also default for the child POAs The policies are
|
|
<i>never</i> inherited from the parent POA.
|
|
</p><p>
|
|
This set of policies means that each object will have a separate serving
|
|
thread, separate network socket port and usually a separate servant. It
|
|
is appropriate when the expected number of objects is not too large.
|
|
If the expected number of objects is larger than the supportable number
|
|
of threads and socket ports, the SINGLE_THREAD_MODEL
|
|
{@link org.omg.PortableServer.ThreadPolicy} is
|
|
used. Then all objects in POA with this policy are served in a single
|
|
thread, using the same server socket, connected to a single port. If the
|
|
request processing policy is additionally set to USE_DEFAULT_SERVANT,
|
|
all objects of this POA share the same (default) servant.
|
|
</p><p>
|
|
The operations, supported by POA are defined
|
|
separately in {@link org.omg.PortableServer.POAOperations}.
|
|
</p><p>
|
|
<h3>The typical POA usage scenarios</h3>
|
|
<h4>POA converts servant to the object reference</h4>
|
|
In the simpliest case, the servant implementation is connected to POA by
|
|
{@link org.omg.PortableServer.POAOperations#servant_to_reference}, the
|
|
returned object being a target of remote and local invocations.
|
|
It may be converted into the stringified reference, registered with
|
|
the naming service, used locally or, when serving or invoking local or remote
|
|
method, passed as a parameter or return value having the CORBA Object type.
|
|
The object obtains Id from POA and is activated due default implicit
|
|
activation policy. This scenario is supported by the default policy set
|
|
and is used in the most of the "hello world" examples.
|
|
<h4>Servant provides to the object reference</h4>
|
|
The servant can be connected to an ORB by
|
|
{@link org.omg.PortableServer.Servant#_this_object(org.omg.CORBA.ORB)},
|
|
obtaining the object reference. The overridable
|
|
{@link org.omg.PortableServer.Servant#_default_POA()}
|
|
specifies POA to that the servant will be connected. The default method
|
|
connects to the root poa. IDL compilers frequently generate the
|
|
<code>_this(ORB)</code> metod for servants for getting the object reference
|
|
that is already narrowed to the exact object type.
|
|
<h4>Explicit activation with POA assigned ids</h4>
|
|
The objects are activated by calling the
|
|
{@link org.omg.PortableServer.POAOperations#activate_object} on the
|
|
POA with the object in question. The POA allocates, assigns, and
|
|
returns a unique identity value for the object. This scenario requires the
|
|
SYSTEM_ID {@link org.omg.PortableServer.IdAssignmentPolicy}.
|
|
<h4>Explicit Activation with User-assigned Ids</h4>
|
|
The POA supports an explicit activation operation,
|
|
{@link org.omg.PortableServer.POAOperations#activate_object_with_id},
|
|
that associates a servant with the user-defined Object Id.
|
|
This scenario requires the USER_ID
|
|
{@link org.omg.PortableServer.IdAssignmentPolicy}. The servant manager
|
|
may be or may not be used.
|
|
<h4>References before activation</h4>
|
|
It may be useful to create references for objects before activating them.
|
|
Such reference can be created using
|
|
{@link org.omg.PortableServer.POAOperations#create_reference} or
|
|
{@link org.omg.PortableServer.POAOperations#create_reference_with_id}, both
|
|
methods also requiring to give the object repository id. Such object may
|
|
be later activated either by
|
|
{@link org.omg.PortableServer.POAOperations#activate_object_with_id} or
|
|
automatically, if the IMPLICIT_ACTIVATION policy applies.
|
|
<h4>Multiple Ids per servant</h4>
|
|
If the MULTIPLE_ID policy applies, the servant may be activated many times.
|
|
Under this policy,
|
|
{@link org.omg.PortableServer.POAOperations#servant_to_reference}
|
|
and {@link org.omg.PortableServer.POAOperations#servant_to_id}
|
|
during each call create a new object and object reference for the
|
|
used servant.
|
|
<h4>One servant for all objects</h4>
|
|
If the USE_DEFAULT_SERVANT policy applies, that default servant serves all
|
|
objects, belonging this POA. This approach is used when there is
|
|
very little data associated with each object, so little that the data can be
|
|
encoded in the Object Id. Also, it may be needed when a very large
|
|
number of objects is expected. If the RETAIN applies, it is possible to
|
|
activate an object explicitly setting the servant other than default.
|
|
If NO_RETAIN applies, the default servant will serve all known an
|
|
unknown objects for that POA.
|
|
<h4>Single Servant, Many Objects and Types</h4>
|
|
Combining USER_ID, USE_DEFAULT_SERVANT and RETAIN, it is possible to
|
|
create and serve objects "on the fly". The servant must determine the
|
|
object type (for instance, from the value of the agreed attribute,
|
|
shared by all supported types, or from the Object Id) and be able to
|
|
handle the method, named in request. If the names and parameter lists
|
|
of the object methods are also created "on the fly", the requests
|
|
to such object can still be submitted using {@link org.omg.CORBA.Request}.
|
|
This method is used when the created object represents some
|
|
entity in the complex database.
|
|
<h4>The ServantLocator finds a servant for each call</h4>
|
|
The {@link org.omg.PortableServer.ServantLocator} is used by POAs that
|
|
combinine NON_RETAIN and USE_SERVANT_MANAGER policies. It provides
|
|
a new or reused servant every time the invocation is made. The servant
|
|
locator must provide a servant in response of calling
|
|
{@link org.omg.PortableServer.ServantLocatorOperations#preinvoke}.
|
|
This method has access the the Id of the object being served and
|
|
the name of the method being called. It must return the appropriate
|
|
instance of the servant or throw an exception, forwarding the request
|
|
to another object (usually in another server). After the invocation,
|
|
a {@link org.omg.PortableServer.ServantLocatorOperations#postinvoke}
|
|
is called. It should be not assumed that the call of <code>preinvoke</code>
|
|
will be followed by the call of the <code>postinvoke</code>; in
|
|
multithreaded environment these calls are not serialized in this way. If
|
|
the <code>preinvoke</code> has to tell something this-call-specific to
|
|
the <code>postinvoke</code>, it must use the provided cookie holder.
|
|
The <code>preinvoke/postinoke</code> are also called to provide a servant
|
|
during each local invocation on the objects, belonging to the described POA.
|
|
</p><p>
|
|
All these scenarios must work with the current GNU Classpath release.
|
|
|
|
@author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
|
|
</body>
|
|
</html>
|