在 Liberty 上使用具有遠端介面的 Enterprise JavaBeans

如果 EJB 是由另一 Java™ 虛擬機器 (JVM) 或相同 JVM 內的另一應用程式管理,您可以利用遠端介面,來遠端存取 Enterprise Java Bean (EJB) 方法。WebSphere® Application Server 使用 RMI-IIOP 技術來實作遠端 EJB 介面。您可以使用 ejbRemote-3.2 特性,來啟用遠端 EJB 支援。

關於這項作業

如果要將 Liberty 伺服器配置成執行啟用遠端 EJB 支援的應用程式,您必須設定 ejbRemote-3.2 特性。

當您使用遠端 EJB 介面時,請檢閱下列注意事項:

命名

使用 java: 名稱空間

EJB 規格要求遠端介面需連結至 java: 名稱空間;例如:
java:global/ExampleApp/ExampleModule/ExampleBean!com.ibm.example.ExampleRemoteInterface    
java:app/ExampleModule/ExampleBean!com.ibm.example.ExampleRemoteInterface    
java:module/ExampleBean!com.ibm.example.ExampleRemoteInterface

不像在 WebSphere® Application Server traditional 中,EJB 元件不會連結至預設「Java 命名和目錄介面 (JNDI) 」名稱空間,因此 ibm-*-bnd.xml 檔中的 @EJB 查閱和連結不得使用此名稱空間。對於同一伺服器內所管理的 EJB 元件,這些查閱必須使用 java: 名稱,對於在另一伺服器中管理的 EJB 元件,這些查閱必須使用 corbaname: URL。

使用 corbaname: URL
這些介面也會連結至相似的環境定義中的 ORB CosNaming 名稱服務,以指向 java:global 名稱空間中所用的那些介面。您可以利用 corbaname: URL,透過 JNDI 來存取這些介面;例如:
corbaname::test.ibm.com:2809#ejb/global/ExampleApp/ExampleModule/ExampleHomeBean!com.ibm.example.ExampleEJBHomecorbaname:rir:#ejb/global/ExampleApp/ExampleModule/ExampleHomeBean!com.ibm.example.ExampleEJBHome   

在伺服器上,rir: 形式的 URL 使用本端名稱服務。在用戶端上,則會使用預設或所配置的遠端名稱服務。

跳出 corbaname: URL

根據 Object Management Group (OMG) Naming Service 規格,corbaname: URL 中的某些字元必須跳出。Liberty 會嘗試判斷衍生自 java:global 名稱空間的 corbaname: URL 是否需要跳出,然後使其自動跳出。並非所有情況都能執行跳出。舉例來說,如果名稱含有單一點 (.),且沒有無效的字元,就無法自動跳出。若要強制以特定方式來解譯名稱,必須按照 OMG 命名服務規格中的說明,手動跳出 URL。

請考量 Enterprise Bean 的下列 java:global 名稱:
java:global/TestApp/TestModule/TestBean!test.TestRemoteInterface
簡易形式的 corbaname: URL 無法自動跳出,因為它代表另一個有效的位置。因此,下列 URL 不會如預期般運作:
corbaname:rir:#ejb/global/TestApp/TestModule/TestBean!test.TestRemoteInterface
反倒是必須手動跳出這個 URL,如下所示:
corbaname:rir:#ejb/global/TestApp/TestModule/TestBean!test%5c.TestRemoteInterface

OMG 命名服務規格會完整說明 corbaname: URL 的跳出語法。

以程式設計方式使用 JNDI 名稱
您可以用程式設計方式,從 InitialContext 查閱這些範例中的所有 URL 和 JNDI 名稱。當您查閱 java: 名稱時,可將產生的物件直接強制轉型為預期的類型;例如:
Object found = new InitialContext().lookup("java:global/ExampleApp/ExampleModule/ExampleBean!com.ibm.example.ExampleRemoteInterface");
ExampleRemoteInterface bean = (ExampleRemoteInterface) found;
不過,當您利用 corbaname: URL 來擷取物件時,必須使用 RMI 樣式的強制轉型,稱為 narrowing;例如:
Object found = new InitialContext().lookup("corbaname:rir:#ejb/global/ExampleApp/ExampleModule/ExampleBean!com.ibm.example.ExampleRemoteInterface");
ExampleRemoteInterface bean = (ExampleRemoteInterface)PortableRemoteObject.narrow(found, ExampleRemoteInterface.class);
交互作業能力
如果 Enterprise Bean 將 EJB 2.x 遠端程式設計模型與 EJBHomeEJBObject 搭配使用(當它利用 2.0 版部署描述子包裝在 EJB JAR 模組中時),只要產品支援 IIOP 通訊協定,就可以呼叫這些 Enterprise Bean。 WLP_INSTALL_DIR/clients/ejbRemotePortable.jar 檔必須包含在遠端用戶端的類別路徑中。這個檔案包含與 Liberty 伺服器通訊所需的系統值類別。如果您是從 WebSphere Application Server Liberty 或 WebSphere Application Server traditional來遠端存取 EJB 元件,就不需要這個檔案。對於在 Liberty 中使用 EJB 3 遠端程式設計模型的 EJB 元件,WebSphere Application Server 程序可以遠端存取它們。Liberty 不提供小型用戶端供您從獨立式 Java 程序來啟動 EJB 元件。對於遠端 EJB 元件,Liberty 不提供工作量管理或失效接手功能,包括當您啟動從 WebSphere Application Server traditional 管理的 EJB 元件時也一樣。
Stub 類別
當您啟動 WebSphere Application Server 上所管理的遠端 EJB 時,用戶端必須包含 Stub 類別。在某些情況下,如果用戶端是 WebSphere Application Server,該產品會自動產生正確的 Stub 類別:
  • 如果用戶端應用程式啟動同一應用程式內的遠端 EJB,Liberty 會自動產生 Stub 類別。
  • 如果目標 EJB 在另一應用程式上執行,並且將 EJB 2.x 遠端程式設計模型與 EJBHomeEJBObject 搭配使用,用戶端的類別路徑中必須包含 Stub 類別。如果是在 WebSphere Application Server traditional 中管理 EJB,在 ejbdeploy 指令處理 EJB 之後,您可以從 EAR 中的應用程式複製 EJB 用戶端 JAR。如果是在 WebSphere Application Server Liberty 中管理 EJB,您必須使用 Java SDK 隨附的 rmic 程式,為目標 EJB 產生 Stub 類別,然後必須在用戶端中隨附這些 Stub 類別。
  • 如果目標 EJB 是在另一應用程式上執行,且正在使用 EJB 3 遠端程式設計模型,用戶端 WebSphere Application Server Liberty 或 WebSphere Application Server traditional 程序會自動產生 Stub 類別。對於在 Liberty 上使用 EJB 3 遠端程式設計模型的 EJB 元件,只能由 WebSphere Application Server 或 WebSphere Application Client 程序從遠端存取它。
交易傳播
Liberty 不支援出埠或入埠交易傳播。此外,EJB 規格要求即使產品支援出埠交易傳播,仍必須傳送空值交易環境定義。使用 Required(預設值)、MandatorySupports 交易屬性的 EJB 元件必須拒絕這項環境定義。如果用戶端或伺服器位於 Liberty 中,具有作用中廣域交易的用戶端將無法啟動使用預設交易屬性的 EJB。如果將 EJB 變更為使用 RequiresNewNotSupported 交易屬性,用戶端可以啟動 EJB。不過,EJB 所完成的交易工作,不會在用戶端交易中確定。
非同步方法
EJB 遠端介面可以具有非同步方法,且其回覆值的類型是 Future。伺服器會將 Future 物件傳回給用戶端,以用來擷取該值。建議不要使用遠端非同步方法,因為不斷累積非聲明的結果,可能耗盡記憶體。為了紓解此問題,只要用戶端在 24 小時內未擷取結果,或者非請求的結果數上限超過 1000,伺服器中的結果就會到期。您可以在 server.xml 檔中調整這些值;例如:
<ejbContainer>        
     <async maxUnclaimedRemoteResults="10"unclaimedRemoteResultTimeout="10m"/>    
</ejbContainer>

程序

  1. 如果要啟用這項特性,請更新 server.xml 檔,以便新增 ejbRemote-3.2 特性;例如:
    <featureManager>
         <feature>ejbRemote-3.2</feature>
    </featureManager>
  2. 針對部署描述子 <ejb-ref> 中所定義或利用原始碼註釋 @EJB 來定義的遠端 EJB 參照,配置您的應用程式連結檔 ibm-*-bnd.xml 檔。 如果 EJB 參照會提供查閱名稱(不論是在註釋或部署描述子中提供),就不需要連結。在連結檔中,可以使用 EJB 的其中一個 java: 名稱或搭配其中一個 corbaname: 名稱,來連結 EJB 參照;例如:
    針對 EJB 參照:
    @EJB(name="TestBean")
       TestRemoteInterface testBean;
    所定義的連結如下:
     <ejb-ref name="TestBean" binding-name="corbaname:rir:#ejb/global/TestApp/TestModule/TestBean!test%5c.TestRemoteInterface"/>
  3. 將應用程式用戶端配置成包含 Stub 類別。
  4. (選用)在遠端用戶端的類別路徑中新增 WLP_INSTALL_DIR/clients/ejbRemotePortable.jar 檔,以針對支援 IIOP 通訊協定的應用程式,配置交互作業能力,以便使用 EJB 遠端介面。

指示主題類型的圖示 作業主題



「時間戳記」圖示 前次更新: 2016 年 11 月 30 日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twlp_ejb_remote
檔名:twlp_ejb_remote.html