Module  java.naming

Package javax.naming.event

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

该包定义了Java命名和目录接口(JNDI)的事件通知操作。 JNDI为以Java编程语言编写的应用程序提供命名和目录功能。 它被设计为独立于任何特定的命名或目录服务实现。 因此,可以以一种常见的方式访问各种服务 - 新的,新兴的和已经部署的服务。

命名事件

该包定义了一个NamingEvent类来表示由命名/目录服务生成的事件。 它还定义了ContextDirContext子接口,称为EventContextEventDirContext ,通过该EventDirContext ,应用程序可以注册他们对上下文触发的事件的兴趣。

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