模块 java.naming
Package 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 documentation中找到。- 从以下版本开始:
- 1.3
-
接口摘要 接口 描述 EventContext 包含注册/取消注册侦听器的方法,以便在上下文中命名的对象发生更改时触发事件。EventDirContext 包含注册侦听器的方法,以便在目录上下文中指定的对象发生更改时触发事件。NamespaceChangeListener 指定对命名空间更改感兴趣的侦听器必须实现的方法。NamingListener 此接口是处理NamingEvent
的侦听器接口的根。ObjectChangeListener 指定事件类型为OBJECT_CHANGED
的NamingEvent
的侦听OBJECT_CHANGED
必须实现的方法。 -
类摘要 类 描述 NamingEvent 此类表示由命名/目录服务触发的事件。NamingExceptionEvent 此类表示当用于收集通知侦听器NamingEvent
的信息的过程/进程投掷NamingException
。