- 所有超接口:
-
Context
- 所有已知子接口:
-
EventDirContext
目标
addNamingListener()
方法中的名称参数被称为目标。目标与范围一起标识出侦听器感兴趣的对象。可以注册对不存在的目标的兴趣,但是服务提供程序和底层协议/服务支持此操作的程度可能会有限制。
如果服务仅支持对现有目标进行注册,那么尝试为不存在的目标注册将导致尽早抛出NameNotFoundException
,最好在调用addNamingListener()
时抛出,或者如果不可能,则侦听器将通过NamingExceptionEvent
接收异常。
此外,对于仅支持对现有目标进行注册的服务提供程序,当侦听器已注册的目标随后从命名空间中删除时,侦听器将通过NamingExceptionEvent
(包含NameNotFoundException
)收到通知。
应用程序可以使用targetMustExist()
方法来检查EventContext
是否支持注册不存在的目标。
事件源
调用注册方法的EventContext
实例是(可能)生成的事件的事件源。源不一定是目标命名的对象。只有当目标是空名称时,目标命名的对象才是源。换句话说,目标与范围参数一起用于标识侦听器感兴趣的对象,但事件源是侦听器已注册的EventContext
实例。
例如,假设侦听器进行以下注册:
随后删除命名为"x/y"的对象时,相应的NamespaceChangeListener listener = ...; src.addNamingListener("x", SUBTREE_SCOPE, listener);
NamingEvent
(evt
)必须包含:
evt.getEventContext() == src evt.getOldBinding().getName().equals("x/y")
此外,侦听器的注册/取消注册是与EventContext
实例进行的,而不是与命名空间中的相应对象进行的。如果程序打算在某个时刻删除侦听器,则需要保留对调用addNamingListener()
的EventContext
实例的引用(就像需要保留对侦听器的引用以便稍后删除一样)。它不能期望执行lookup()
并获得另一个EventContext
实例,以便执行取消注册。
注册的生命周期
当以下情况发生时,已注册的侦听器将被取消注册:- 使用
removeNamingListener()
将其移除。 - 在收集有关事件信息时抛出异常。也就是说,当侦听器收到
NamingExceptionEvent
时。 - 在已注册的
EventContext
实例上调用Context.close()
。
EventContext
实例将继续存在并由服务提供程序维护。
侦听器实现
注册/取消注册方法接受NamingListener
的实例。有NamingEvent
的不同事件类型的NamingListener
子接口。例如,ObjectChangeListener
接口用于NamingEvent.OBJECT_CHANGED
事件类型。要注册对多个事件类型的兴趣,侦听器实现应实现多个NamingListener
子接口,并使用单个addNamingListener()
调用。除了减少方法调用次数和可能减少侦听器代码大小外,这还允许某些服务提供程序优化注册。
线程问题
与一般Context
实例一样,EventContext
实例不能保证是线程安全的。当多个线程同时访问同一EventContext
时,必须小心。有关线程问题的更多信息,请参阅包描述。
- 自版本:
- 1.3
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
表达对涉及目标命名对象的事件感兴趣的常量。static final int
表达对涉及目标命名上下文中的对象的事件感兴趣的常量,不包括目标命名的上下文。static final int
表达对涉及目标命名对象的子树中的对象的事件感兴趣的常量,包括目标命名的对象。Fields declared in interface javax.naming.Context
APPLET, AUTHORITATIVE, BATCHSIZE, DNS_URL, INITIAL_CONTEXT_FACTORY, LANGUAGE, OBJECT_FACTORIES, PROVIDER_URL, REFERRAL, SECURITY_AUTHENTICATION, SECURITY_CREDENTIALS, SECURITY_PRINCIPAL, SECURITY_PROTOCOL, STATE_FACTORIES, URL_PKG_PREFIXES
-
Method Summary
Modifier and TypeMethodDescriptionvoid
addNamingListener
(String target, int scope, NamingListener l) 添加侦听器,以便在命名为字符串目标名称和范围更改时接收命名事件。void
addNamingListener
(Name target, int scope, NamingListener l) 添加侦听器,以便在由目标和范围标识的对象更改时接收命名事件。void
从此EventContext
中删除接收命名事件的侦听器。boolean
确定侦听器是否可以注册对不存在的目标感兴趣。Methods declared in interface javax.naming.Context
addToEnvironment, bind, bind, close, composeName, composeName, createSubcontext, createSubcontext, destroySubcontext, destroySubcontext, getEnvironment, getNameInNamespace, getNameParser, getNameParser, list, list, listBindings, listBindings, lookup, lookup, lookupLink, lookupLink, rebind, rebind, removeFromEnvironment, rename, rename, unbind, unbind
-
Field Details
-
OBJECT_SCOPE
static final int OBJECT_SCOPE表达对涉及目标命名对象的事件感兴趣的常量。此常量的值为
0
。- 另请参阅:
-
ONELEVEL_SCOPE
static final int ONELEVEL_SCOPE表达对涉及目标命名上下文中的对象的事件感兴趣的常量。此常量的值为
1
。- 另请参阅:
-
SUBTREE_SCOPE
static final int SUBTREE_SCOPE表达对涉及目标命名对象的子树中的对象的事件感兴趣的常量。此常量的值为
2
。- 另请参阅:
-
-
Method Details
-
addNamingListener
添加侦听器,以便在由目标和范围标识的对象更改时接收命名事件。这些事件的事件源是此上下文。有关事件源和目标的讨论,请参阅类描述。请参阅常量OBJECT_SCOPE
、ONELEVEL_SCOPE
和SUBTREE_SCOPE
的描述,了解scope
如何影响注册。当
scope
为ONELEVEL_SCOPE
时,target
需要命名一个上下文。如果scope
为OBJECT_SCOPE
或SUBTREE_SCOPE
,则target
可以命名非上下文。例如,对于非上下文使用SUBTREE_SCOPE
可能很有用,例如,如果调用者事先不知道target
是否为上下文,只想注册对以target
为根的(可能退化的子树)的兴趣。当侦听器收到事件通知时,侦听器可能在与执行
addNamingListener()
的线程不同的线程中被调用。当多个线程同时访问同一EventContext
时,必须小心。有关线程问题的更多信息,请参阅包描述。- 参数:
-
target
- 一个非空名称,将相对于此上下文解析。 -
scope
-OBJECT_SCOPE
、ONELEVEL_SCOPE
或SUBTREE_SCOPE
之一。 -
l
- 非空侦听器。 - 抛出:
-
NamingException
- 如果添加侦听器时遇到问题。 - 另请参阅:
-
addNamingListener
添加侦听器,以便在命名为字符串目标名称和范围更改时接收命名事件。有关接受Name
的重载的详细信息,请参阅。- 参数:
-
target
- 相对于此上下文解析的非空字符串名称。 -
scope
-OBJECT_SCOPE
、ONELEVEL_SCOPE
或SUBTREE_SCOPE
之一。 -
l
- 非空侦听器。 - 抛出:
-
NamingException
- 如果添加侦听器时遇到问题。 - 另请参阅:
-
removeNamingListener
从此EventContext
中删除接收命名事件的侦听器。侦听器可能已经使用不同的目标/范围参数多次注册了此EventContext
。调用此方法后,侦听器将不再接收此EventContext
实例作为事件源的事件(除了那些已经在被分派过程中的事件)。如果侦听器未注册或不再注册到此EventContext
实例,则此方法不执行任何操作。- 参数:
-
l
- 非空侦听器。 - 抛出:
-
NamingException
- 如果移除侦听器时遇到问题。 - 另请参阅:
-
targetMustExist
确定侦听器是否可以注册对不存在的目标感兴趣。- 返回值:
- 如果目标必须存在则返回true;如果目标可以不存在则返回false。
- 抛出异常:
-
NamingException
- 如果无法确定上下文在这方面的行为。
-