Module java.naming

Package javax.naming.event


package javax.naming.event
提供对访问命名和目录服务时的事件通知的支持。

此包定义了Java命名和目录接口(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文档中找到。
自:
1.3
  • Class
    Description
    包含用于注册/取消注册监听器以在更改上下文中命名的对象时触发事件的方法。
    包含用于注册监听器以在更改目录上下文中命名的对象时触发事件的方法。
    指定对命名空间更改感兴趣的监听器必须实现的方法。
    此类表示由命名/目录服务触发的事件。
    此类表示当用于收集通知NamingEvent的信息的过程/进程抛出NamingException时触发的事件。
    此接口是处理NamingEvent的根监听器接口。
    指定对具有事件类型OBJECT_CHANGEDNamingEvent的监听器必须实现的方法。