開發訪問資源適配器的EJB組件
EJB組件通過資源適配器來訪問EIS,在EJB組件中,定義了最終客戶端要使用的業務方 法,一般實現為會話Bean,它一般通過和多個J2EE組件或者資源適配器交互來完成具體的 業務邏輯。在這個案例中,EJB組件的功能非常簡單,就是接收最終客戶端的請求,然後通 過資源適配器調用EIS並獲得結果,最終把結果返回給客戶端。
EJB組件定義了一個業務方法,它的遠程接口的代碼如例程1所示。
例程1 EJB組件的遠程接口
package com.hellking.jca.ejb;
import java.rmi.RemoteException;
import javax.ejb.*;
public interface Demo extends EJBObject
{
public String sayHello(String arg) throws RemoteException;
}
在這個接口裡,定義了一個業務方法,就是sayHello(String name)。我們來看EJB組件 的實現類部分代碼,如例程2所示。
例程2 EJB實現類的部分代碼
package com.hellking.jca.ejb;
import ….
public class DemoEJB implements SessionBean
{
private SessionContext sessionCtx;
//業務方法
public String sayHello(String arg)throws Exception
{
System.out.println("echo, arg="+arg);
String result="";
try
{
InitialContext iniCtx = new InitialContext();
Context enc = (Context) iniCtx.lookup("java:comp/env");
Object ref = enc.lookup("eis/DemoEISFactory");//獲得連接工廠
ConnectionFactory dcf = (ConnectionFactory) ref;
DemoConnection dc =(DemoConnection) dcf.getConnection();//從連接工廠 創建連接
result=dc.sayHello(arg);//調用虛擬連接的業務方法
dc.close();//使用完,關閉虛擬的連接。
}
catch(NamingException e)
{
System.err.println("在查找JNDI名字時遇到錯誤:"+ e);
}
return result;//返回調用的結果
}
…
}
以上代碼是典型的使用資源適配器的方法,首先通過JNDI來查找連接工廠實例(這個實 例由應用服務器自動綁定),然後從這個連接工廠獲得連接實例,接下來從連接實例調用 業務方法,最後關閉連接。
開發客戶端
本案例使用了兩種類型的客戶端,一種客戶端基於浏覽器,它通過HTTP訪問JSP組件, JSP組件通過RMI調用EJB組件,EJB組件再通過資源適配器調用EIS;另一種客戶端是普通的 Java程序,這個Java程序通過RMI調用EJB,EJB組件再通過資源適配器調用EIS。
在實現中,JSP代碼和普通java程序的代碼基本一樣,不同的是它們獲得初始上下文環 境(InitialContext)的方法不同。
我們看一下簡單的JSP客戶端,如例程3所示。
例程3 JSP客戶端
<%@ page contentType="text/html;charset=gb2312" import="com.hellking.jca.ejb.*,javax.naming.*"%>
<html><body><form><table><tr><td>請輸入名字 :
</td><td><input name=name type=text></td></tr>
<tr><td><input value=submit type=submit></td></tr></table></form>
<%
String name=(String)request.getParameter("name");
try
{
InitialContext context=new InitialContext();
DemoHome home=(DemoHome)javax.rmi.PortableRemoteObject.narrow(
context.lookup("ejb/demo"),DemoHome.class);
Demo demo=home.create();
if(demo!=null)out.println("demo is ok");
out.println("調用ejb-->jca-->eis");
out.println("發送了:hellking,返回以下的值:<hr><font color=red>");
out.println(demo.sayHello(name));
out.println("</font>");
out.flush();
}
catch(Exception e)
{
}
%></body></html>
普通的java客戶端和JSP基本一樣,只是需要指定相關的屬性才能獲得InitialContext 實例。可以通過以下的方法獲得InitialContext實例。
例程4 在普通的Java客戶端獲得InitialContext實例
//創建初始的上下文環境
public Client()
{
context=this.getInitialContext();
}
public InitialContext getInitialContext()
{
try
{
Properties p=new Properties();
p.load(new FileInputStream("config.properties"));
return new InitialContext(p);
}
catch(Exception e)
{
System.out.println("got ee");
e.printStackTrace();
return null;
}
}
Java客戶端的詳細代碼見src/client/Client.java文件。
下面介紹裝配和部署的相關問題。
部署方法介紹
在不同的應用服務器下部署J2EE應用時,基本上大同小異。部署工作基本上按照以下步 驟進行:
把J2EE應用和連接器打包成ear文件;
使用應用服務器廠商提供的工具把ear裝配成可以部署的ear包,在裝配的過程中,和應 用服務器特定的部署描述符自動添加到ear包中;
使用應用服務器提供的控制台進行部署,在部署時,可能需要指定一些屬性。
對於JBOSS,沒有提供裝配工具和部署控制台,需要手工進行編寫專有的部署描述,並 且手工部署。
在進行裝配、部署工作前,請把J2EE應用打包成ear文建,打包後的結構如下:
+resource.ear
+hello.jar
-META-INF/ejb-jar.xml
+com/hellking/jca
+com/hellking/jca/ejb
+demo.rar
-META-INF/ra.xml
+com/hellking/jca
+web.war
-WEB-INF/web.xml
-test.jsp
-META-INF/application.xml
下面首先介紹在J2SDKEE1.3下裝配和部署J2EE應用。
在J2SDKEE1.3下部署連接器和J2EE應用
step1 首先啟動J2EE和部署工具,在控制台輸入:
start j2ee -verbose
start deploytool
step2 新建一個應用。
依次點擊【File】à【new】à【Application】,選擇應用的目錄,輸入應用的名稱,如 圖1所示。
圖1新建一個應用
step3 把資源適配器添加到應用中
依次點擊【File】→【new】→【Resource Adapter】,在第一個窗口點擊【next】, 然後把資源適配器的類添加進來,然後點擊【next】,如圖2所示。
圖2 添加資源適配器相關的類
在下一個窗口指定資源適配器的相關接口和實現類,如圖3所示。
圖3 指定資源適配器的相關接口和實現類
然後點擊【vsersion information】按鈕,輸入版本相關的信息,完成後,點擊【next 】。
在下一個窗口為連接工廠添加兩個屬性,然後點擊【next】,它們的名稱和值如圖4所 示。
圖4 為連接工廠添加屬性
在解下來的窗口直接點擊【next】,最後將生成部署代碼,點擊【finish】。
Step4 把EJB組件添加到J2EE應用中
【File】→【new】→【Enterprise Bean】,然後把EJB組件相關的類添加進來,如圖5 所示。
圖5 添加EJB組件相關的類
接下來的窗口指定Bean的類型為無狀態會話Bean,實現類為DemoEJB,遠程接口為Demo ,Home接口為DemoHome,然後在接下來的窗口直接點擊【Next】,直到出現資源工廠引用 窗口,添加一個資源工廠引用,它的名字為"eis/DemoEISFactory",類型 是"javax.resource.cci.ConnectionFactory",如圖6所示。
圖6 為EJB添加資源引用
然後點擊【finish】。
Step5 新建一個Web組件,把test.jsp測試頁面添加進來。
Step6 在部署工具中指定EJB的JNDI名字為"ejb/demo"。
Step 7 指定Web組件的Context(上下文)為"/resource"。
Step8 檢查裝配的描述是否正確,選中resource應用,然後點擊工具欄 圖標即可。
Step9 部署,選中resource應用,然後點擊工具欄 ,在彈出的對話框點擊【finish】 即可。
Step10 部署成功後,把資源適配器添加到對應的應用服務器,使其運行。如圖7所示, 選擇localhost,點擊【new】。
圖7 把資源適配器添加到服務器
然後指定連接工廠的JNDI,如圖8所示。
圖8 指定連接工廠的JNDI
部署成功後,啟動EIS服務器,EIS服務器通過執行src/eis-server/run.bat進行啟動, 然後就可以進行測試了,在浏覽器裡輸入:
http://localhost:8000/resource/test.jsp
進行測試。如果一切順利,將在頁面中返回測試的結果,如圖9所示。
圖9 測試資源適配器
在測試時,通用可以看到EIS服務器也輸出了類似以下的信息:
啟動服務....監聽客戶端連接...接收到一個連接監聽客戶端連接...接收到以下輸入: hellking
在IBM WebShpere5.0下部署連接器和J2EE應用
step1 啟動應用程序組裝器,打開需要裝配的J2EE應用,如圖10所示。
圖10打開需要裝配的J2EE應用
step2 選中DemoEJB,點擊【綁定】選項卡,輸入DemoEJB的JNDI名字,然後點擊【應用 】,如圖11所示。
圖11 確定DemoEJB的JNDI名字
step3 其它的值都默認,然後保存更改。
Step4 生成部署代碼。順次點擊【文件】→【生成部署代碼】,在彈出的對話框裡點擊 【現在生成】。如圖12所示。
圖12 生成部署代碼
注意生成代碼時應該是沒有錯誤的,如果有錯誤,請參考對應的錯誤信息。
Step5 啟動IBM Websphere服務器,在浏覽器裡輸入:
http://localhost:9090/admin
進入管理控制台。
Step6 部署J2EE應用。
選擇【應用程序】→【安裝新的應用程序】,浏覽到剛才生成的部署代碼,如圖13所示 ,然後點擊【下一步】。
圖13 安裝應用程序第一步
在接下來的幾個窗口直接點擊【下一步】,直到出現如圖14所示的窗口,在這個窗口中 指定映射資源引用到資源的JNDI名字,這個是"eis/DemoEISFactory"。
圖14 指定映射資源引用到資源的JNDI名字
其它的步驟全部默認即可,配置完成後,保存配置。
Step7 啟動剛部署的J2EE應用
順次選擇【應用程序】à【企業應用程序】,然後選中剛部署的程序,點擊【啟動】。
Step8 為資源適配器指定J2C連接工廠
選中剛才部署的J2EE應用,順次選擇【連接器模塊】→【demo.rar】→【J2C 連接工廠 】,新建一個J2C連接工廠,它的名稱為DemoEISFactory,JNDI名稱 為"eis/DemoEISFactory",其它默認,然後點擊確定。最後別忘了保存配置。
Step9 重新啟動應用服務器,啟動EIS服務(src/eis-server/run.bat),在浏覽器裡 輸入:
http://localhost:9080/resource/test.jsp?name=hellking
進行測試,如果測試成功,那麼結果和圖9一樣。
在JBOSS3.2下部署連接器和J2EE應用
JBOSS雖然沒有裝配工具和部署控制台,但是在JBOSS下部署J2EE應用和資源適配器同樣 非常方便,JBOSS支持及時開發、及時部署的方式,當把要部署的應用拷貝到JBOSS的部署 目錄下,JBOSS應用服務器會自動部署它。
在JBOSS下部署應用時,可以不打包,而是直接J2EE應用放在名稱為***.jar、***.ear 的文件夾下。如圖15所示。
圖15 JBOSS下的J2EE應用的結構
Step1 手工編寫資源適配器的部署描述符,如例程5所示。
例程5 JBOSS下的資源適配器的部署描述符
<server>
<mbean code="org.jboss.resource.connectionmanager.NoTxConnectionManager"
name="jboss.jca:service=NoTxCM,name=DemoRA">
<depends>jboss.jca:service=RARDeployer</depends>
<depends optional-attribute-name="ManagedConnectionFactoryName">
<mbean code="org.jboss.resource.connectionmanager.RARDeployment"
name="jboss.jca:service=NoTxDemo,name=DemoRA">
<depends optional-attribute-name="OldRarDeployment">
jboss.jca:service=RARDeployment,name=DemoRA
</depends>
<attribute name="JndiName">NoTransDemo</attribute>
</mbean>
</depends>
<depends optional-attribute-name="ManagedConnectionPool">
<mbean code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool"
name="jboss.jca:service=NoTxPool,name=DemoRA">
<attribute name="MinSize">0</attribute>
<attribute name="MaxSize">50</attribute>
<attribute name="BlockingTimeoutMillis">5000</attribute>
<attribute name="IdleTimeoutMinutes">15</attribute>
<attribute name="Criteria">ByContainer</attribute>
</mbean>
</depends>
<depends optional-attribute-name="CachedConnectionManager">
jboss.jca:service=CachedConnectionManager
</depends>
<depends optional-attribute-name="JaasSecurityManagerService">
jboss.security:service=JaasSecurityManager
</depends>
</mbean>
</server>
注意上面的兩個黑體字,name=DemoRA,這裡的DemoRA必須和資源適配器部署描述符 ra.xml中的"DemoRA"保持一致,NoTransDemo是使用這個資源適配器的JNDI名字,使 用"java:/ NoTransDemo"來引用它。把這個文件保存為hellkingjca-service.xml。
Step2 手工編寫EJB的部署描述符jboss.xml。
並且在部署描述符裡指定對資源適配器的引用。如例程6所示。
例程6 在EJB的描述中指定對資源適配器的引用
<?xml version="1.0"?>
<jboss>
<secure>false</secure>
<container-configurations />
<resource-managers />
<enterprise-beans>
<session>
<ejb-name>DemoEJB</ejb-name>
<jndi-name>ejb/demo</jndi-name>
<resource-ref>
<res-ref-name>eis/DemoEISFactory</res-ref-name>
<jndi-name>java:/NoTransDemo</jndi-name>
</resource-ref>
</session>
</enterprise-beans>
</jboss>
注意對資源適配器引用的JNDI名字,它必須和hellkingjca-service.xml的指定的JNDI 名字一致。把這個文件保存在resource.ear/hello.jar/META-INF/目錄下。
Step 3 部署,把resource.ear文件夾和hellkingjca-service.xml拷貝到 %JBOSS_HOME%\\server\\default\\deploy\\ 目錄下。啟動JBOSS,部署就會自動完成。
Step4 測試,啟動JBOSS和EIS服務(src/eis-server/run.bat),在浏覽器裡輸入:
http://localhost:8080/resource/test.jsp?name=hellking
即可進行測試,如果一切成功,那麼結果應該和圖9一樣。
在BEA Weblogic8.1下部署連接器和J2EE應用
step1 啟動Weblogic Builder,打開待裝配的應用(resource.ear)。
step 2 指定DemoEJB的JNDI名字。
選中DemoEJB,點擊【General】選項卡,在JNDI name中輸入"ejb/demo",如圖16所示 。
圖16 在Weblogic Builder裡指定EJB的JNDI名字
step3 指定資源適配器連接工廠的名字和JNDI名字:
選擇DemoRA,點擊【Weblogic Settings】選項卡,找到"Connection Factory name"標 簽,在下面的輸入框輸入"DemoEISFactory",然後找到"JNDI name"標簽,在下面的文本框 輸入"eis/DemoEISFactory",它是這個連接工廠綁定的JNDI名字。
Step4 指定EJB對資源適配器連接工廠的引用:
點擊DemoEJB,選擇Resource,再點擊【Resource References】選項卡,編輯這個引用 的屬性,把JNDI名字改為"eis/DemoEISFactory",如圖17所示。
圖17 確定EJB引用的資源適配器的連接工廠的名字
step5 其它的值都默認,保存這個應用,weblogic Builder會自動生成可以部署的代碼 。
Step 8 部署
啟動Weblogic引用服務器,在浏覽器裡輸入:
http://localhost:7001/console
輸入用戶名和密碼進行驗證,進入控制台,順次點擊【mydomain】à【Applications】à 【Deploy a new Application】à【upload your file(s)】,然後上載剛生成的可部署代 碼。上載完成後,選擇這個上載的文件,點擊【Contnue】,在接下來的窗口點擊【Deploy 】,如果出現圖18所示的窗口,表示部署成功了。
圖18 在Weblogic下部署成功
Step 9 測試,部署完成後,啟動EIS服務(src/eis-server/run.bat),然後在浏覽器 裡輸入:
http://localhost:7001/resource/test.jsp
進行測試,如果一切順利,獲得的結果和圖9一致。
總結
從以上不同的部署過程可以看出,J2EE應用和資源適配器在不同的服務器平台下具有良 好的可移植性。對於EJB組件,需要在應用服務器特有的部署描述符中指定JNDI名字。至於 EJB對資源適配器連接工廠的引用方式的指定,它們又有所差別,有的在裝配時就指定資源 適配器連接工廠的JNDI名字,這種方式下,應用服務器啟動或者資源適配器部署時,它的 連接工廠就綁定到JNDI名稱空間,比如Weblogic就是這樣;而有的應用服務器需要在部署 時為資源適配器指定連接工廠的JNDI名字,然後再在EJB的部署中進行映射,比如 Websphere就是這種方式。