|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
public interface ORBInitializerOperations
便於註冊 interceptor 和初始化 ORB。
ORB 服務憑借 Interceptor 這一方法獲得進行 ORB 處理的權力,Interceptor 實際上已成為 ORB 的一部分。因為 Interceptor 是 ORB 的一部分,所以當 ORB.init
返回 ORB 時,應該已經註冊了 Interceptor。在已經調用 ORB.init
返回 Interceptor 後,不能在 ORB 上註冊 Interceptor。
通過註冊實作 ORBInitializer
介面的關聯的 ORBInitializer
物件才能註冊 Interceptor。ORB 在初始化時,應該調用每個已註冊 ORBInitializer
,並將用來註冊其 Interceptor 的 ORBInitInfo
物件傳遞給該 ORB。
用 Java 註冊 ORB Initializer
ORBInitializer 通過 Java ORB 屬性註冊。
屬性名稱的形式如下:
org.omg.PortableInterceptor.ORBInitializerClass.<Service>
其中 <Service>
是實作以下類別的字元串名稱:
org.omg.PortableInterceptor.ORBInitializer
要避免名稱衝突,應使用與 DNS 名稱約定相反的約定。例如,如果 X 公司有三個 initializer,則它能夠定義以下屬性:
org.omg.PortableInterceptor.ORBInitializerClass.com.x.Init1
org.omg.PortableInterceptor.ORBInitializerClass.com.x.Init2
org.omg.PortableInterceptor.ORBInitializerClass.com.x.Init3
org.omg.PortableInterceptor.ORBInitializerClass
開頭的屬性,提取每個屬性的 <Service>
部分,然後將該 <Service>
字元串作為類別名來實例化某個物件,並對該物件調用 pre_init
和 post_init
方法。如果存在異常,ORB 應忽略這些異常並繼續進行。
範例
例如,X 公司編寫的客戶端登陸可能具有以下 ORBInitializer 實作:
要運行使用此日誌記錄服務的名為
package com.x.logging;
import org.omg.PortableInterceptor.Interceptor;
import org.omg.PortableInterceptor.ORBInitializer;
import org.omg.PortableInterceptor.ORBInitInfo;
public class LoggingService implements ORBInitializer {
void pre_init( ORBInitInfo info ) {
// Instantiate the Logging Service s Interceptor.
Interceptor interceptor = new LoggingInterceptor();
// Register the Logging Service s Interceptor.
info.add_client_request_interceptor( interceptor );
}
void post_init( ORBInitInfo info ) {
// This service does not need two init points.
}
}
MyApp
的程序,使用者可以鍵入:
java -Dorg.omg.PortableInterceptor.ORBInitializerClass.com.x.Logging.LoggingService MyApp
註冊 Interceptor 的有關注意事項:
每個 ORB 都要註冊請求 Interceptor。
要獲得虛擬的針對物件的 Interceptor,應在截取點內的目標上查詢策略以確定它們是否應該執行某些操作。
要獲得虛擬的針對 POA 的 Interceptor,應使用不同的 ORB 實例化每個 POA。雖然在管理上 Interceptor 是有序的,但註冊 Interceptor 時並不需要按順序進行。請求 Interceptor 參與服務上下文。服務上下文沒有順序,因此請求 Interceptor 也沒有必要有順序。IOR Interceptor 參與帶標記的元件。帶標記的元件沒有順序,因此 IOR Interceptor 也沒有必要有順序。
註冊程式碼應該避免使用 ORB(即使用提供的 orb_id
調用 ORB.init
)。因為註冊發生在初始化 ORB 期間,對出於此狀態的 ORB 進行調用的結果是不確定的。
ORBInitInfo
方法摘要 | |
---|---|
void |
post_init(ORBInitInfo info)
初始化 ORB 期間調用此方法。 |
void |
pre_init(ORBInitInfo info)
初始化 ORB 期間調用此方法。 |
方法詳細資訊 |
---|
void pre_init(ORBInitInfo info)
ORBInitInfo.register_initial_reference
註冊那些初始服務。
info
- 提供 Interceptor 據以註冊的初始化屬性和操作。void post_init(ORBInitInfo info)
調用 post_init
操作並不是初始化 ORB 的最後一項工作。調用 post_init
之後的最後一項工作是將已註冊 interceptor 列表附加到 ORB。因此,在調用 post_init
期間,ORB 不包含 interceptor。如果從 post_init
內部進行間接 ORB 調用,則在該調用上不會調用任何請求 interceptor。類似的,如果執行了導致創建 IOR 的操作,也不會調用任何 IOR interceptor。
info
- 提供 Interceptor 據以註冊的初始化屬性和操作。
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。