java.rmi.activation

接口
异常
java.lang.Object
  继承者 java.rmi.server.RemoteObject
      继承者 java.rmi.server.RemoteServer
          继承者 java.rmi.server.UnicastRemoteObject
              继承者 java.rmi.activation.ActivationGroup
所有已实现的接口:
Serializable, ActivationInstantiator, Remote

public abstract class ActivationGroup
     
extends UnicastRemoteObject
implements ActivationInstantiator

ActivationGroup 负责创建组中“可激活”对象的新实例,在以下情况通知其 ActivationMonitor:它的对象变成活动的或者不活动的,或者整个组变成不活动的。

ActivationGroup 通过以下方式之一被初始 创建:

  • 一方面,为组中的第一个可激活对象创建一个不带显式 ActivationGroupIDActivationDesc,或者
  • 通过 ActivationGroup.createGroup 方法
  • 另一方面,激活只有 ActivationGroupDesc 被注册的组中的第一个对象。

只有激活器能重建 一个 ActivationGroup。激活器根据需要为每个已注册的激活组生成一个单独的 VM(例如,作为一个子进程),并且将激活请求导向适当的组。它是如何生成 VM 的特定实现。一个激活组通过 ActivationGroup.createGroup 静态方法创建。createGroup 方法在创建组方面有两个需求:1) 组必须是 ActivationGroup 的一个具体子类,以及 2) 组必须具有带两个参数的构造方法:

  • 组的 ActivationGroupID ,以及
  • 组的初始化数据(在 java.rmi.MarshalledObject 中)

组被创建后,ActivationGroup 的默认实现将在创建 ActivationGroupDesc 时用请求的属性重写系统属性,并且将设置一个 java.rmi.RMISecurityManager 作为默认的系统安全管理器。如果应用程序需要对象在组中被激活时设置特定的属性,则应用程序应当创建一个特殊的包含这些属性的 Properties 对象,然后使用此 Properties 对象创建一个 ActivationGroupDesc,并且在创建任何 ActivationDesc 之前使用 ActivationGroup.createGroup(在默认的 ActivationGroupDesc 被创建之前)。如果应用程序需要使用安全管理器而不是 java.rmi.RMISecurityManager,则在 ActivativationGroupDescriptor 属性列表中可以将 java.security.manager 属性设置为想要安装的安全管理器的名称。

从以下版本开始:
1.2
另请参见:
ActivationInstantiator, ActivationGroupDesc, ActivationGroupID, 序列化表格

字段摘要
 
从类 java.rmi.server.RemoteObject 继承的字段
ref
 
构造方法摘要
protected ActivationGroup(ActivationGroupID groupID)
          用给定的激活组标识符创建一个激活组。
 
方法摘要
protected  void activeObject(ActivationID id, MarshalledObject<? extends Remote> mobj)
          如果子类要进行对组监视器的 activeObject 回调,则此 protected 方法是必要的。
abstract  void activeObject(ActivationID id, Remote obj)
          当对象被导出时(通过 Activatable 对象的构造或者通过显式调用 Activatable.exportObject),组的 activeObject 方法被调用。
static ActivationGroup createGroup(ActivationGroupID id, ActivationGroupDesc desc, long incarnation)
          为当前 VM 创建并设置激活组。
static ActivationGroupID currentGroupID()
          返回当前激活组的标识符。
static ActivationSystem getSystem()
          返回该 VM 的激活系统。
protected  void inactiveGroup()
          如果子类要进行对组监视器的 inactiveGroup 回调,则此 protected 方法是必要的。
 boolean inactiveObject(ActivationID id)
          通过调用 Activatable.inactive 方法间接地调用组的 inactiveObject 方法。
static void setSystem(ActivationSystem system)
          设置该 VM 的激活系统。
 
从类 java.rmi.server.UnicastRemoteObject 继承的方法
clone, exportObject, exportObject, exportObject, unexportObject
 
从类 java.rmi.server.RemoteServer 继承的方法
getClientHost, getLog, setLog
 
从类 java.rmi.server.RemoteObject 继承的方法
equals, getRef, hashCode, toString, toStub
 
从类 java.lang.Object 继承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait
 
从接口 java.rmi.activation.ActivationInstantiator 继承的方法
newInstance
 

构造方法详细信息

ActivationGroup

protected ActivationGroup(ActivationGroupID groupID)
                   throws RemoteException
用给定的激活组标识符创建一个激活组。该组将作为一个 java.rmi.server.UnicastRemoteObject 被导出。

参数:
groupID - 组标识符
抛出:
RemoteException - 如要组不能被导出
从以下版本开始:
1.2
方法详细信息

inactiveObject

public boolean inactiveObject(ActivationID id)
                       throws ActivationException,
                              UnknownObjectException,
                              RemoteException
通过调用 Activatable.inactive 方法间接地调用组的 inactiveObject 方法。当该对象不活动(对象认为它不再活动)时,远程对象实现必须调用 Activatableinactive 方法。当对象不活动时,如果对象未调用 Activatable.inactive,则该对象永远不被垃圾回收,因为组保持对它创建的对象的强引用。

组的 inactiveObject 方法从 RMI 运行时取消导出远程对象,因此该对象无法再接收传入的 RMI 调用。如果对象没有任何挂起或者执行的调用,则该对象将仅仅被取消导出。ActivationGroup 的子类必须重写此方法并且取消导出该对象。

从 RMI 运行时移除该对象之后,组必须通知其 ActivationMonitor(通过 inactiveObject 方法),该远程对象当前不是活动的,因此远程对象将在后续激活请求上由激活器重新激活。

此方法简单地通知组的监视器,该对象是不活动的。由 ActivationGroup 的具体子类来实现取消导出该对象的附加需求。

参数:
id - 对象的激活标识符
返回:
如果该对象被成功地取消激活,则返回 true,否则返回 false。
抛出:
UnknownObjectException - 如果对象未知(可能已经是不活动的)
RemoteException - 如果调用通知监视器失败
ActivationException - 如果组是不活动的
从以下版本开始:
1.2

activeObject

public abstract void activeObject(ActivationID id,
                                  Remote obj)
                           throws ActivationException,
                                  UnknownObjectException,
                                  RemoteException
当对象被导出时(通过 Activatable 对象的构造或者通过显式调用 Activatable.exportObject),组的 activeObject 方法被调用。组必须通知其 ActivationMonitor 对象是不活动的(通过监视器的 activeObject 方法),如果该组还没有这么做的话。

参数:
id - 对象的标识符
obj - 远程对象实现
抛出:
UnknownObjectException - 如果对象未注册
RemoteException - 如果调用通知监视器失败
ActivationException - 如果组是不活动的
从以下版本开始:
1.2

createGroup

public static ActivationGroup createGroup(ActivationGroupID id,
                                          ActivationGroupDesc desc,
                                          long incarnation)
                                   throws ActivationException
为当前 VM 创建并设置激活组。仅当当前尚未设置激活组时才设置激活组。当 Activator 初始化激活组的重建以执行传入的 activate 请求时,激活组使用 createGroup 方法来设置。在组可以通过此方法创建之前,该组必须首先通过 ActivationSystem 注册。

ActivationGroupDesc 指定的组类必须是 ActivationGroup 的具体子类,并且具有一个公共的带两个参数的构造方法:组的 ActivationGroupID 和包含组的初始化数据的 MarshalledObject(从 ActivationGroupDesc 获得)。

如果 ActivationGroupDesc 中指定的组类名为 null,则此方法将像组描述符包含默认激活组实现类的名称一样执行。

注意,如果应用程序创建其自己的自定义激活组,则必须为该组设置安全管理器。否则,该组中的对象不能被激活,默认设置为 java.rmi.RMISecurityManager

如果在该组的 VM 中已经设置安全管理器,此方法首先调用该安全管理器的 checkSetFactory 方法。这可能会导致抛出 SecurityException。如果应用程序需要设置不同的安全管理器,则必须确保由组的 ActivationGroupDesc 所指定的策略文件授予该组必要的权限来设置一个新的安全管理器。(注:如果组下载并设置一个安全管理器,这将是必要的)。

在组被创建之后,通过调用 activeGroup 方法通知 ActivationSystem 该组是活动的,返回该组的 ActivationMonitor。应用程序无需独立调用 activeGroup,因为它通过此方法来维护。

一旦组被创建,对 currentGroupID 方法的后续调用将返回此组的标识符,直到组变为不活动的。

参数:
id - 激活组的标识符
desc - 激活组的描述符
incarnation - 组的代号(在组初始化创建时为零)
返回:
针对该 VM 的激活组
抛出:
ActivationException - 如果组已经存在或者如果在组创建过程中发生错误
SecurityException - 如果创建组的权限被拒绝。(注:安全管理器 checkSetFactory 方法的默认实现需要 RuntimePermission 的 "setFactory")
从以下版本开始:
1.2
另请参见:
SecurityManager.checkSetFactory()

currentGroupID

public static ActivationGroupID currentGroupID()
返回当前激活组的标识符。如果此 VM 当前没有任何组是活动的,则返回 null。

返回:
激活组的标识符
从以下版本开始:
1.2

setSystem

public static void setSystem(ActivationSystem system)
                      throws ActivationException
设置该 VM 的激活系统。仅当当前没有组是活动的,才可以设置激活系统。如果激活系统未通过此调用来设置,则 getSystem 方法尝试通过在 Activator 注册表中查找名称 "java.rmi.activation.ActivationSystem" 来获取对 ActivationSystem 的引用。默认情况下,用于查找该激活系统的端口号由 ActivationSystem.SYSTEM_PORT 定义。此端口可通过设置属性 java.rmi.activation.port 而被重写。

如果存在安全管理器,则此方法首先调用安全管理器的 checkSetFactory 方法。这可能会导致抛出 SecurityException 异常。

参数:
system - 对 ActivationSystem 的远程引用
抛出:
ActivationException - 如果已经设置激活系统
SecurityException - 如果设置激活系统的权限被拒绝。(注:安全管理器 checkSetFactory 方法的默认实现需要 RuntimePermission 的 "setFactory")
从以下版本开始:
1.2
另请参见:
getSystem(), SecurityManager.checkSetFactory()

getSystem

public static ActivationSystem getSystem()
                                  throws ActivationException
返回该 VM 的激活系统。激活系统可以通过 setSystem 方法设置。如果激活系统未通过 setSystem 方法设置,则 getSystem 方法尝试通过在 Activator 注册表中查找名称 "java.rmi.activation.ActivationSystem" 来获取对 ActivationSystem 的引用。默认情况下,用于查找该激活系统的端口号由 ActivationSystem.SYSTEM_PORT 定义。此端口可通过设置属性 java.rmi.activation.port 而被重写。

返回:
该 VM/组的激活系统
抛出:
ActivationException - 如果激活系统无法获得或者未绑定(意味着它没有运行)
从以下版本开始:
1.2
另请参见:
setSystem(java.rmi.activation.ActivationSystem)

activeObject

protected void activeObject(ActivationID id,
                            MarshalledObject<? extends Remote> mobj)
                     throws ActivationException,
                            UnknownObjectException,
                            RemoteException
如果子类要进行对组监视器的 activeObject 回调,则此 protected 方法是必要的。此调用简单地转发到组的 ActivationMonitor

参数:
id - 对象的标识符
mobj - 包含远程对象的 stub 的编组对象
抛出:
UnknownObjectException - 如果对象未注册
RemoteException - 如果调用通知监视器失败
ActivationException - 如果发生激活错误
从以下版本开始:
1.2

inactiveGroup

protected void inactiveGroup()
                      throws UnknownGroupException,
                             RemoteException
如果子类要进行对组监视器的 inactiveGroup 回调,则此 protected 方法是必要的。此调用简单地转发到组的 ActivationMonitor。同时,该 VM 的当前组被设置为 null。

抛出:
UnknownGroupException - 如果组未注册
RemoteException - 如果调用通知监视器失败
从以下版本开始:
1.2