javax.naming.event

接口
在访问命名和目录服务时提供对事件通知的支持。

请参见:
          描述

接口摘要
EventContext 包含注册/注销侦听器的一些方法,这些侦听器在上下文中命名的对象发生更改时获得触发事件的通知。
EventDirContext 包含注册侦听器的一些方法,这些侦听器在目录上下文中命名的对象发生更改时将获得触发事件的通知。
NamespaceChangeListener 指定对名称空间更改感兴趣的侦听器必须实现的方法。
NamingListener 此接口是处理 NamingEvent 的侦听器接口的根。
ObjectChangeListener 指定事件类型为 OBJECT_CHANGEDNamingEvent 侦听器必须实现的方法。
 

类摘要
NamingEvent 此类表示命名/目录服务触发的事件。
NamingExceptionEvent 此类表示用来收集通知 NamingEvent 侦听器的信息的过程/进程抛出 NamingException 时触发的事件。
 

软件包 javax.naming.event 的描述

在访问命名和目录服务时提供对事件通知的支持。

此包定义 Java Naming and Directory InterfaceTM (JNDI) 的事件通知操作。  JNDI 向使用 Java 编程语言编写的应用程序提供命名和目录功能。它被设计成与任何特定的命名或目录服务实现无关。因此可以使用共同的方式对多种服务(新的、新出现的及已经部署的服务)进行访问。

命名事件

此包定义 NamingEvent 类以表示由命名/目录服务生成的事件。它还定义 ContextDirContext 的子接口(分别称为 EventContextEventDirContext),应用程序可以通过这些子接口注册它们感兴趣的、由上下文触发的事件。

NamingEvent 表示在命名或目录服务中发生的事件。有两种命名事件:

  • 影响名称空间的事件(添加/移除/重命名对象)
  • 影响对象内容的事件。
这两种事件分别由对应的侦听器处理: NamespaceChangeListenerObjectChangeListener

例如,应用程序可以按以下方式注册对上下文中的对象进行的其感兴趣的更改:

EventContext src = 
    (EventContext)(new InitialContext()).lookup("o=wiz,c=us");
src.addNamingListener("ou=users", EventContext.ONELEVEL_SCOPE,
    new ChangeHandler());
...
class ChangeHandler implements ObjectChangeListener {
    public void objectChanged(NamingEvent evt) {
        System.out.println(evt.getNewBinding());
    }
    public void namingExceptionThrown(NamingExceptionEvent evt) {
        System.out.println(evt.getException());
    }
}

线程问题

将事件指派给侦听器时,侦听器方法(如 objectChanged())可以在没有执行调用 addNamingListener() 的某个线程中执行。由服务提供者选择要使用的线程。将一个事件指派给多个侦听器时,服务提供者可以选择(通常建议这样做)在各个线程中并发执行侦听器方法。

当侦听器实例调用 NamingEvent.getEventContext() 时,它必须考虑到其他线程可能将并发使用该上下文。同样,在通过 addNamingListener() 注册侦听器时,注册线程也必须考虑到类似的可能性,即服务提供者稍后可能在新创建的线程中调用这些侦听器。因为一般不保证 Context 实例是线程安全的,所以必须根据需要同步所有上下文操作。

异常处理

当侦听器在上下文中注册事件时,上下文可能需要进行一些内部处理以便收集生成事件所需的信息。例如,上下文可能需要向服务器请求注册在服务器上进行的感兴趣更改,这些更改最终将被转换为事件。如果发生了阻止收集关于事件的信息的异常,则侦听器将永远无法获得这些事件的通知。发生此类异常时,将触发 NamingExceptionEvent 来通知侦听器。侦听器的 namingExceptionThrown() 方法被调用(如上文示例代码所示),侦听器被自动注销。

包规范

JNDI API 规范及相关文档可在 JNDI documentation 中找到。

从以下版本开始:
1.3