模块  java.naming

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 documentation中找到。
从以下版本开始:
1.3