模块 java.naming
包 javax.naming.event
包javax.naming.event
在访问命名和目录服务时提供对事件通知的支持。
该包定义了 Java 命名和目录接口 (JNDI) 的事件通知操作。 JNDI 为用 Java 编程语言编写的应用程序提供命名和目录功能。它旨在独立于任何特定的命名或目录服务实现。因此,可以以通用方式访问各种服务——新的、新兴的和已经部署的服务。
命名事件
该包定义了一个 NamingEvent
类来表示由命名/目录服务生成的事件。它还定义了 Context
和 DirContext
的子接口,称为 EventContext
和 EventDirContext
,应用程序可以通过它们注册它们对上下文触发的事件的兴趣。
NamingEvent
表示在命名或目录服务中发生的事件。有两类命名事件:
- 影响命名空间的那些(添加/删除/重命名对象)
- 那些影响对象内容的。
NamespaceChangeListener
、ObjectChangeListener
。
例如,应用程序可以注册它对上下文中对象更改的兴趣,如下所示:
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
-
类描述包含用于注册/取消注册监听的方法,以通知在上下文中命名的对象发生更改时触发的事件。包含用于注册监听的方法,这些监听将在目录上下文中命名的对象发生更改时收到事件通知。指定对名称空间更改感兴趣的监听必须实现的方法。此类表示由命名/目录服务触发的事件。此类表示当用于收集信息以通知
NamingEvent
的监听器的过程/进程抛出NamingException
时触发的事件。此接口是处理NamingEvent
的监听器接口的根。指定事件类型为OBJECT_CHANGED
的NamingEvent
的监听器必须实现的方法。