Module
java.naming
Package javax.naming.event
访问命名和目录服务时,提供对事件通知的支持。
该包定义了Java命名和目录接口(JNDI)的事件通知操作。 JNDI为以Java编程语言编写的应用程序提供命名和目录功能。 它被设计为独立于任何特定的命名或目录服务实现。 因此,可以以一种常见的方式访问各种服务 - 新的,新兴的和已经部署的服务。
命名事件
该包定义了一个NamingEvent
类来表示由命名/目录服务生成的事件。 它还定义了Context
和DirContext
子接口,称为EventContext
和EventDirContext
,通过该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
s的侦听器接口的根。ObjectChangeListener 指定一个的监听器的方法NamingEvent
用的事件类型OBJECT_CHANGED
必须实现。 -
类摘要 Class 描述 NamingEvent 此类表示由命名/目录服务触发的事件。NamingExceptionEvent 此类代表当用于收集通知NamingEvent
的听众的信息的过程/过程抛出NamingException
。