開發訪問資源適配器的EJB組件
EJB組件通過資源適配器來訪問EIS,在EJB組件中,定義了最終客戶端要使用的業務方法,一般實現為會話Bean,它一般通過和多個J2EE組件或者資源適配器交互來完成具體的業務邏輯.在這個案例中,EJB組件的功能非常簡單,就是接收最終客戶端的請求,然後通過資源適配器調用EIS並獲得結果,最終把結果返回給客戶端.
EJB組件定義了一個業務方法,它的遠程介面的代碼如常式1所示.
常式1 EJB組件的遠程介面
1 常式1 EJB組件的遠程介面 2 package com.hellking.jca.ejb; 3 import java.rmi.RemoteException; 4 import javax.ejb.*; 5 public interface Demo extends EJBObject 6 { 7 public String sayHello(String arg) throws RemoteException; 8 } 9 |
在這個介面里,定義了一個業務方法,就是sayHello(String name).我們來看EJB組件的實現類部分代碼,如常式2所示.
常式2 EJB實現類的部分代碼
1 常式2 EJB實現類的部分代碼 2 package com.hellking.jca.ejb; 3 import …. 4 public class DemoEJB implements SessionBean 5 { 6 private SessionContext sessionCtx; 7 8 //業務方法 9 public String sayHello(String arg)throws Exception 10 { 11 System.out.println("echo, arg=" arg); 12 String result=""; 13 try 14 { 15 InitialContext iniCtx = new InitialContext(); 16 Context enc = (Context) iniCtx.lookup("java:comp/env"); 17 Object ref = enc.lookup("eis/DemoEISFactory");//獲得連接工廠 18 ConnectionFactory dcf = (ConnectionFactory) ref; 19 DemoConnection dc =(DemoConnection) dcf.getConnection();//從連接工廠創建連接 20 result=dc.sayHello(arg);//調用虛擬連接的業務方法 21 dc.close();//使用完,關閉虛擬的連接. 22 } 23 catch(NamingException e) 24 { 25 System.err.println("在查找JNDI名字時遇到錯誤:" e); 26 } 27 return result;//返回調用的結果 28 } 29 … 30 } 31 |
以上代碼是典型的使用資源適配器的方法,首先通過JNDI來查找連接工廠實例(這個實例由應用伺服器自動綁定),然後從這個連接工廠獲得連接實例,接下來從連接實例調用業務方法,關閉連接.
開發客戶端
本案例使用了兩種類型的客戶端,一種客戶端基於瀏覽器,它通過HTTP訪問JSP組件,JSP組件通過RMI調用EJB組件,EJB組件再通過資源適配器調用EIS;另一種客戶端是普通的Java程序,這個Java程序通過RMI調用EJB,EJB組件再通過資源適配器調用EIS.
在實現中,JSP代碼和普通java程序的代碼基本一樣,不同的是它們獲得初始上下文環境(InitialContext)的方法不同.
我們看一下簡單的JSP客戶端,如常式3所示.
常式3 JSP客戶端
1 常式3 JSP客戶端 2 <%@ page contentType="text/html;charset=gb2312" import="com.hellking.jca.ejb.*,javax.naming.*"%> 3 <html><body><form><table><tr><td>請輸入名字: 4 </td><td><input name=name type=text></td></tr> 5 <tr><td><input value=submit type=submit></td></tr></table></form> 6 <% 7 String name=(String)request.getParameter("name"); 8 try 9 { 10 InitialContext context=new InitialContext(); 11 DemoHome home=(DemoHome)javax.rmi.PortableRemoteObject.narrow( 12 context.lookup("ejb/demo"),DemoHome.class); 13 Demo demo=home.create(); 14 if(demo!=null)out.println("demo is ok"); 15 out.println("調用ejb-->jca-->eis"); 16 out.println("發送了:hellking,返回以下的值:<hr><font color=red>"); 17 out.println(demo.sayHello(name)); 18 out.println("</font>"); 19 out.flush(); 20 } 21 catch(Exception e) 22 { 23 } 24 %></body></html> 25 |
普通的java客戶端和JSP基本一樣,只是需要指定相關的屬性才能獲得InitialContext實例.可以通過以下的方法獲得InitialContext實例.
常式4 在普通的Java客戶端獲得InitialContext實例
1 常式4 在普通的Java客戶端獲得InitialContext實例 2 //創建初始的上下文環境 3 public Client() 4 { 5 context=this.getInitialContext(); 6 } 7 public InitialContext getInitialContext() 8 { 9 try 10 { 11 Properties p=new Properties(); 12 p.load(new FileInputStream("config.properties")); 13 return new InitialContext(p); 14 } 15 catch(Exception e) 16 { 17 System.out.println("got ee"); 18 e.printStackTrace(); 19 return null; 20 } 21 } 22 |
Java客戶端的詳細代碼見src/client/Client.java文件.
下面介紹裝配和部署的相關問題.
部署方法介紹
在不同的應用伺服器下部署J2EE應用時,基本上大同小異.部署工作基本上按照以下步驟進行:
把J2EE應用和連接器打包成ear文件;
使用應用伺服器廠商提供的工具把ear裝配成可以部署的ear包,在裝配的過程中,和應用伺服器特定的部署描述符自動添加到ear包中;
使用應用伺服器提供的控制台進行部署,在部署時,可能需要指定一些屬性.
對於JBOSS,沒有提供裝配工具和部署控制台,需要手工進行編寫專有的部署描述,並且手工部署.
在進行裝配、部署工作前,請把J2EE應用打包成ear文建,打包后的結構如下:
1 resource.ear 2 hello.jar 3 -META-INF/ejb-jar.xml 4 com/hellking/jca 5 com/hellking/jca/ejb 6 demo.rar 7 -META-INF/ra.xml 8 com/hellking/jca 9 web.war 10 -WEB-INF/web.xml 11 -test.jsp 12 -META-INF/application.xml 13 |
下面首先介紹在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下的資源適配器的部署描述符
1 常式5 JBOSS下的資源適配器的部署描述符 2 <server> 3 <mbean code="org.jboss.resource.connectionmanager.NoTxConnectionManager" 4 name="jboss.jca:service=NoTxCM,name=DemoRA"> 5 <depends>jboss.jca:service=RARDeployer</depends> 6 <depends optional-attribute-name="ManagedConnectionFactoryName"> 7 <mbean code="org.jboss.resource.connectionmanager.RARDeployment" 8 name="jboss.jca:service=NoTxDemo,name=DemoRA"> 9 <depends optional-attribute-name="OldRarDeployment"> 10 jboss.jca:service=RARDeployment,name=DemoRA 11 </depends> 12 <attribute name="JndiName">NoTransDemo</attribute> 13 </mbean> 14 </depends> 15 <depends optional-attribute-name="ManagedConnectionPool"> 16 <mbean code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool" 17 name="jboss.jca:service=NoTxPool,name=DemoRA"> 18 <attribute name="MinSize">0</attribute> 19 <attribute name="MaxSize">50</attribute> 20 <attribute name="BlockingTimeoutMillis">5000</attribute> 21 <attribute name="IdleTimeoutMinutes">15</attribute> 22 <attribute name="Criteria">ByContainer</attribute> 23 </mbean> 24 </depends> 25 <depends optional-attribute-name="CachedConnectionManager"> 26 jboss.jca:service=CachedConnectionManager 27 </depends> 28 <depends optional-attribute-name="JaasSecurityManagerService"> 29 jboss.security:service=JaasSecurityManager 30 </depends> 31 </mbean> 32 </server> 33 |
注意上面的兩個黑體字,name=DemoRA,這裡的DemoRA必須和資源適配器部署描述符ra.xml中的"DemoRA"保持一致,NoTransDemo是使用這個資源適配器的JNDI名字,使用"java:/ NoTransDemo"來引用它.把這個文件保存為hellkingjca-service.xml.
Step2 手工編寫EJB的部署描述符jboss.xml.
並且在部署描述符里指定對資源適配器的引用.如常式6所示.
常式6 在EJB的描述中指定對資源適配器的引用
1 常式6 在EJB的描述中指定對資源適配器的引用 2 <?xml version="1.0"?> 3 <jboss> 4 <secure>false</secure> 5 <container-configurations /> 6 <resource-managers /> 7 <enterprise-beans> 8 <session> 9 <ejb-name>DemoEJB</ejb-name> 10 <jndi-name>ejb/demo</jndi-name> 11 <resource-ref> 12 <res-ref-name>eis/DemoEISFactory</res-ref-name> 13 <jndi-name>java:/NoTransDemo</jndi-name> 14 </resource-ref> 15 </session> 16 </enterprise-beans> 17 </jboss> 18 |
注意對資源適配器引用的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就是這種方式.
[火星人 ] 在不同平台下部署J2EE連接器和J2EE應用已經有661次圍觀