模块 java.naming

接口 EventContext

所有父级接口:
Context
所有已知的子接口:
EventDirContext

public interface EventContext extends Context
包含用于注册/取消注册监听的方法,以通知在上下文中命名的对象发生更改时触发的事件。

Target

addNamingListener() 方法中的名称参数称为 target 。目标连同范围一起标识监听器感兴趣的对象。可以注册对不存在的目标的兴趣,但是在可以支持的范围内可能存在限制服务提供者和底层协议/服务。

如果服务仅支持现有目标的注册,则尝试注册不存在的目标会导致 NameNotFoundException 尽早抛出,最好是在调用 addNamingListener() 时抛出,否则如果不可能,监听器将收到异常通过 NamingExceptionEvent

此外,对于仅支持注册现有目标的服务提供者,当监听器注册的目标随后从命名空间中删除时,将通过 NamingExceptionEvent(包含 NameNotFoundException)通知监听器。

应用程序可以使用方法 targetMustExist() 检查 EventContext 是否支持注册不存在的目标。

事件源

您在其上调用注册方法的 EventContext 实例是(可能)生成的事件的 event source。源是not necessarily目标命名的对象。只有当目标为空名时,目标命名的对象才是源。换句话说,目标与范围参数一起用于标识监听器感兴趣的对象,但事件源是监听器已注册的EventContext实例。

例如,假设监听进行以下注册:

   NamespaceChangeListener listener = ...;
   src.addNamingListener("x", SUBTREE_SCOPE, listener);
当随后删除名为“x/y”的对象时,相应的 NamingEvent (evt ) 必须包含:
   evt.getEventContext() == src
   evt.getOldBinding().getName().equals("x/y")

此外,监听器注册/注销是通过 EventContext instance 进行的,而不是通过命名空间中的相应对象进行的。如果程序打算在某个时候删除监听器,则它需要保留对其调用 addNamingListener()EventContext 实例的引用(就像它需要保留对监听器的引用以便稍后将其删除一样)。它不能指望执行 lookup() 并获得另一个 EventContext 实例来执行注销。

注册有效期

在以下情况下,已注册的监听将被注销:
  • 使用 removeNamingListener() 将其删除。
  • 收集有关事件的信息时抛出异常。也就是说,当监听器收到 NamingExceptionEvent 时。
  • Context.close() 在它注册的 EventContext 实例上被调用。
在此之前,具有优秀监听器的 EventContext 实例将继续存在并由服务提供商维护。

监听实现

注册/注销方法接受 NamingListener 的实例。对于 NamingEvent 的不同事件类型,有 NamingListener 的子接口。例如,ObjectChangeListener 接口用于 NamingEvent.OBJECT_CHANGED 事件类型。要注册对多种事件类型的兴趣,监听器实现应实现多个 NamingListener 子接口并使用 addNamingListener() 的单个调用。除了减少方法调用的数量和可能减少监听器的代码大小之外,这还允许一些服务提供商优化注册。

线程问题

与一般的 Context 实例一样,不能保证 EventContext 的实例是线程安全的。当多个线程同时访问同一个 EventContext 时必须小心。有关线程问题的更多信息,请参阅 包装说明
自从:
1.3
  • 字段详细信息

    • OBJECT_SCOPE

      static final int OBJECT_SCOPE
      常量,用于表达对与目标命名的对象有关的事件的兴趣。

      此常量值为 0.

      参见:
    • ONELEVEL_SCOPE

      static final int ONELEVEL_SCOPE
      常量,用于表达对与目标命名的上下文中的对象有关的事件的兴趣,不包括目标命名的上下文。

      此常量值为 1.

      参见:
    • SUBTREE_SCOPE

      static final int SUBTREE_SCOPE
      表示对目标命名对象的子树中对象的事件感兴趣的常量,包括目标命名的对象。

      此常量值为 2.

      参见:
  • 方法详情

    • addNamingListener

      void addNamingListener(Name  target, int scope, NamingListener  l) throws NamingException
      添加一个监听器,用于接收当目标和范围标识的对象发生更改时触发的命名事件。这些事件的事件源是这个上下文。有关事件源和目标的讨论,请参阅类描述。请参阅常量 OBJECT_SCOPEONELEVEL_SCOPESUBTREE_SCOPE 的说明,了解 scope 如何影响注册。

      target 仅在 scopeONELEVEL_SCOPE 时才需要命名上下文。如果 scopeOBJECT_SCOPESUBTREE_SCOPEtarget 可以命名一个非上下文。将 SUBTREE_SCOPE 用于非上下文可能很有用,例如,如果调用者事先不知道 target 是否是上下文并且只想注册对以 target 为根的(可能退化的子树)的兴趣。

      当监听器收到事件通知时,监听器可能会在执行 addNamingListener() 的线程以外的线程中调用。当多个线程同时访问同一个 EventContext 时必须小心。有关线程问题的更多信息,请参阅 包装说明

      参数:
      target - 要相对于此上下文解析的非空名称。
      scope - OBJECT_SCOPEONELEVEL_SCOPESUBTREE_SCOPE 之一。
      l - 非空监听器。
      抛出:
      NamingException - 如果在添加监听器时遇到问题。
      参见:
    • addNamingListener

      void addNamingListener(String  target, int scope, NamingListener  l) throws NamingException
      添加一个监听器,用于接收在由字符串目标名称和范围命名的对象发生更改时触发的命名事件。有关详细信息,请参阅接受 Name 的重载。
      参数:
      target - 相对于此上下文解析的对象的非空字符串名称。
      scope - OBJECT_SCOPEONELEVEL_SCOPESUBTREE_SCOPE 之一。
      l - 非空监听器。
      抛出:
      NamingException - 如果在添加监听器时遇到问题。
      参见:
    • removeNamingListener

      void removeNamingListener(NamingListener  l) throws NamingException
      从接收此 EventContext 激发的命名事件中删除监听器。监听器可能已多次使用此 EventContext 注册,可能使用不同的目标/范围参数。调用该方法后,监听器将不再接收以该EventContext实例为事件源的事件(已经在派发过程中的事件除外)。如果监听器没有或不再注册到此 EventContext 实例,则此方法不执行任何操作。
      参数:
      l - 非空监听器。
      抛出:
      NamingException - 如果在删除监听器时遇到问题。
      参见:
    • targetMustExist

      boolean targetMustExist() throws NamingException
      确定监听是否可以注册对不存在的目标的兴趣。
      返回:
      如果目标必须存在,则为真;如果目标不需要存在,则为 false。
      抛出:
      NamingException - 如果上下文在这方面的行为无法确定。