歡迎您光臨本站 註冊首頁

在不同平台下部署J2EE連接器和J2EE應用

←手機掃碼閱讀     火星人 @ 2014-03-10 , reply:0

  開發訪問資源適配器的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次圍觀

http://coctec.com/docs/java/show-post-61955.html