JavaTM 2 Platform
Standard Ed. 6

javax.naming.event
介面 EventContext

所有父級介面:
Context
所有已知子介面:
EventDirContext

public interface EventContext
extends Context

包含註冊/註銷偵聽器的一些方法,這些偵聽器在上下文中命名的物件發生更改時獲得觸發事件的通知。

目標

addNamingListener() 方法中的名稱參數被稱為目標。目標和範圍一起標識偵聽器感興趣的物件。註冊不存在的感興趣目標是可能的,但是服務提供者和底層協議/服務對這種情況的支持程度可能存在限制。

如果服務僅支持註冊現有目標,則試圖註冊不存在的目標將導致第一時間拋出 NameNotFoundException,一般是在調用 addNamingListener() 時;如果這沒有發生,則偵聽器將通過 NamingExceptionEvent 收到異常。

此外,對於僅支持註冊現有目標的服務提供者而言,當以後從名稱空間移除註冊過偵聽器的目標時,該偵聽器通過 NamingExceptionEvent(包含 NameNotFoundException)獲得通知。

應用程序可以使用 targetMustExist() 來檢查 EventContext 是否支持註冊不存在的目標。

事件源

對其調用註冊方法的 EventContext 實例是(可能)產生事件的事件源。源不一定 是目標指定的物件。僅當目標為空名稱時,目標指定的物件才是源。換句話說,目標和範圍參數一起用於標識偵聽器感興趣的物件,而事件源是偵聽器註冊的 EventContext 實例。

例如,假定偵聽器進行以下註冊:

        NamespaceChangeListener listener = ...;
        src.addNamingListener("x", SUBTREE_SCOPE, listener);
以後刪除名為 "x/y" 的物件時,相應的 NamingEvent (evt) 必須包含:
        evt.getEventContext() == src
        evt.getOldBinding().getName().equals("x/y")

此外,偵聽器註冊/註銷是使用 EventContext 實例 進行的,而不是使用名稱空間中的相應物件。如果程序在某個時候要移除偵聽器,則它需要保持對要調用 addNamingListener()EventContext 實例的參考(這正如為了以後進行移除而需要保持對偵聽器的參考)。不要期望它能進行 lookup() 而獲取另一個可以執行註銷的 EventContext 實例。

註冊的生命週期

註冊偵聽器在以下情況將被註銷: 這時,具有未完成偵聽器的 EventContext 實例將繼續存在,並由服務提供者繼續維護。

偵聽器實作

註冊/註銷方法接受 NamingListener 的實例。對不同事件型別的 NamingEvent 使用不同的 NamingListener 子介面。例如,ObjectChangeListener 介面用於 NamingEvent.OBJECT_CHANGED 事件型別。要註冊多個感興趣事件型別,偵聽器實作應該實作多個 NamingListener 子介面並調用一次 addNamingListener()。除了減少方法的調用次數並有可能減少偵聽器的程式碼大小之外,這還允許某些服務提供者對註冊進行優化。

執行緒問題

像通常的 Context 實例一樣,不保證 EventContext 實例是執行緒安全的。當多個執行緒共時存取同一個 EventContext 時必須謹慎。有關執行緒問題的更多資訊,請參閱包描述

從以下版本開始:
1.3

欄位摘要
static int OBJECT_SCOPE
          該常數用來表示對涉及目標指定物件的事件感興趣。
static int ONELEVEL_SCOPE
          該常數用來表示對涉及目標指定上下文中物件的事件感興趣,不包括目標指定的上下文。
static int SUBTREE_SCOPE
          該常數用來表示對涉及目標指定物件的子階層樹中物件的事件感興趣,包括目標指定的物件。
 
從介面 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
 
方法摘要
 void addNamingListener(Name target, int scope, NamingListener l)
          添加接收命名事件的偵聽器,這些事件在目標和範圍所標識的物件發生更改時觸發。
 void addNamingListener(String target, int scope, NamingListener l)
          添加接收命名事件的偵聽器,這些事件在目標名稱和範圍指定的物件發生更改時觸發。
 void removeNamingListener(NamingListener l)
          從此 EventContext 觸發的接收命名事件中移除一個偵聽器。
 boolean targetMustExist()
          確定偵聽器是否可以註冊不存在的感興趣目標。
 
從介面 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

void addNamingListener(Name target,
                       int scope,
                       NamingListener l)
                       throws NamingException
添加接收命名事件的偵聽器,這些事件在目標和範圍所標識的物件發生更改時觸發。 這些事件的事件源是此上下文。有關事件源和目標的討論,請參閱類別描述。請參閱對常數 OBJECT_SCOPEONELEVEL_SCOPESUBTREE_SCOPE 的描述,以瞭解 scope 如何影響註冊。

target 僅在 scopeONELEVEL_SCOPE 時需要指定上下文,如果 scope 既不是 OBJECT_SCOPE 也不是 SUBTREE_SCOPE,則 target 可能指定非上下文。例如,如果調用者預先不知道 target 是否是上下文,而只想註冊以 target 為根的(可能退化的)子階層樹,則使用非上下文的 SUBTREE_SCOPE 可能很有用。

當偵聽器收到事件通知時,偵聽器可以在沒有執行 addNamingListener() 的某個執行緒中調用。當多個執行緒共時存取同一個 EventContext 時必須謹慎。有關執行緒問題的更多資訊,請參閱包描述

參數:
target - 要相對於此上下文解析的非 null 名稱。
scope - OBJECT_SCOPEONELEVEL_SCOPESUBTREE_SCOPE 之一。
l - 非 null 偵聽器。
拋出:
NamingException - 如果在添加偵聽器時遇到問題。
另請參見:
removeNamingListener(javax.naming.event.NamingListener)

addNamingListener

void addNamingListener(String target,
                       int scope,
                       NamingListener l)
                       throws NamingException
添加接收命名事件的偵聽器,這些事件在目標名稱和範圍指定的物件發生更改時觸發。 有關詳細資訊,請參閱接受 Name 參數的重載方法。

參數:
target - 相對於此上下文解析的物件的非 null 字元串名稱。
scope - OBJECT_SCOPEONELEVEL_SCOPESUBTREE_SCOPE 之一。
l - 非 null 偵聽器。
拋出:
NamingException - 如果在添加偵聽器時遇到問題。
另請參見:
removeNamingListener(javax.naming.event.NamingListener)

removeNamingListener

void removeNamingListener(NamingListener l)
                          throws NamingException
從此 EventContext 觸發的接收命名事件中移除一個偵聽器。該偵聽器可能在此 EventContext 中註冊過一次以上,並且可能使用不同的目標/範圍參數進行。調用此方法後,偵聽器將不再使用作為事件源的此 EventContext 實例接收事件(已經在指派過程中那些事件除外)。如果偵聽器不(或不再)在此 EventContext 實例中註冊,則此方法不執行任何操作。

參數:
l - 非 null 偵聽器。
拋出:
NamingException - 如果在移除偵聽器時遇到問題。
另請參見:
addNamingListener(javax.naming.Name, int, javax.naming.event.NamingListener)

targetMustExist

boolean targetMustExist()
                        throws NamingException
確定偵聽器是否可以註冊不存在的感興趣目標。

返回:
如果目標存在,則返回 true;如果目標不必存在,則返回 false。
拋出:
NamingException - 如果無法確定上下文的這一行為。

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only