- 所有父级接口:
Context
- 所有已知的子接口:
EventDirContext
Target
addNamingListener()
方法中的名称参数称为 target 。目标连同范围一起标识监听器感兴趣的对象。可以注册对不存在的目标的兴趣,但是在可以支持的范围内可能存在限制服务提供者和底层协议/服务。
如果服务仅支持现有目标的注册,则尝试注册不存在的目标会导致 NameNotFoundException
尽早抛出,最好是在调用 addNamingListener()
时抛出,否则如果不可能,监听器将收到异常通过 NamingExceptionEvent
。
此外,对于仅支持注册现有目标的服务提供者,当监听器注册的目标随后从命名空间中删除时,将通过 NamingExceptionEvent
(包含 NameNotFoundException
)通知监听器。
应用程序可以使用方法 targetMustExist()
检查 EventContext
是否支持注册不存在的目标。
事件源
您在其上调用注册方法的EventContext
实例是(可能)生成的事件的 event source。源是not necessarily目标命名的对象。只有当目标为空名时,目标命名的对象才是源。换句话说,目标与范围参数一起用于标识监听器感兴趣的对象,但事件源是监听器已注册的EventContext
实例。
例如,假设监听进行以下注册:
当随后删除名为“x/y”的对象时,相应的NamespaceChangeListener listener = ...; src.addNamingListener("x", SUBTREE_SCOPE, listener);
NamingEvent
(evt
) 必须包含:
evt.getEventContext() == src evt.getOldBinding().getName().equals("x/y")
此外,监听器注册/注销是通过 EventContext
instance 进行的,而不是通过命名空间中的相应对象进行的。如果程序打算在某个时候删除监听器,则它需要保留对其调用 addNamingListener()
的 EventContext
实例的引用(就像它需要保留对监听器的引用以便稍后将其删除一样)。它不能指望执行 lookup()
并获得另一个 EventContext
实例来执行注销。
注册有效期
在以下情况下,已注册的监听将被注销:- 使用
removeNamingListener()
将其删除。 - 收集有关事件的信息时抛出异常。也就是说,当监听器收到
NamingExceptionEvent
时。 Context.close()
在它注册的EventContext
实例上被调用。
EventContext
实例将继续存在并由服务提供商维护。
监听实现
注册/注销方法接受NamingListener
的实例。对于 NamingEvent
的不同事件类型,有 NamingListener
的子接口。例如,ObjectChangeListener
接口用于 NamingEvent.OBJECT_CHANGED
事件类型。要注册对多种事件类型的兴趣,监听器实现应实现多个 NamingListener
子接口并使用 addNamingListener()
的单个调用。除了减少方法调用的数量和可能减少监听器的代码大小之外,这还允许一些服务提供商优化注册。
线程问题
与一般的Context
实例一样,不能保证 EventContext
的实例是线程安全的。当多个线程同时访问同一个 EventContext
时必须小心。有关线程问题的更多信息,请参阅 包装说明。
- 自从:
- 1.3
-
字段摘要
字段修饰符和类型Field描述static final int
常量,用于表达对与目标命名的对象有关的事件的兴趣。static final int
常量,用于表达对与目标命名的上下文中的对象有关的事件的兴趣,不包括目标命名的上下文。static final int
表示对目标命名对象的子树中对象的事件感兴趣的常量,包括目标命名的对象。 -
方法总结
修饰符和类型方法描述void
addNamingListener
(String target, int scope, NamingListener l) 添加一个监听,用于接收在由字符串目标名称和范围命名的对象发生更改时触发的命名事件。void
addNamingListener
(Name target, int scope, NamingListener l) 添加一个监听,用于接收当目标和范围标识的对象发生更改时触发的命名事件。void
从接收此EventContext
激发的命名事件中删除监听器。boolean
确定监听是否可以注册对不存在的目标的兴趣。在接口 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
-
字段详细信息
-
OBJECT_SCOPE
static final int OBJECT_SCOPE常量,用于表达对与目标命名的对象有关的事件的兴趣。此常量值为
0
.- 参见:
-
ONELEVEL_SCOPE
static final int ONELEVEL_SCOPE常量,用于表达对与目标命名的上下文中的对象有关的事件的兴趣,不包括目标命名的上下文。此常量值为
1
.- 参见:
-
SUBTREE_SCOPE
static final int SUBTREE_SCOPE表示对目标命名对象的子树中对象的事件感兴趣的常量,包括目标命名的对象。此常量值为
2
.- 参见:
-
-
方法详情
-
addNamingListener
添加一个监听器,用于接收当目标和范围标识的对象发生更改时触发的命名事件。这些事件的事件源是这个上下文。有关事件源和目标的讨论,请参阅类描述。请参阅常量OBJECT_SCOPE
、ONELEVEL_SCOPE
和SUBTREE_SCOPE
的说明,了解scope
如何影响注册。target
仅在scope
为ONELEVEL_SCOPE
时才需要命名上下文。如果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
确定监听是否可以注册对不存在的目标的兴趣。- 返回:
- 如果目标必须存在,则为真;如果目标不需要存在,则为 false。
- 抛出:
NamingException
- 如果上下文在这方面的行为无法确定。
-