jboss下ejb簡介
1.jboss簡介
jboss是一個運行ejb的j2ee應用伺服器。它是開放原始碼的項目,遵循最新的j2ee規範。從jboss項目開始至今,它已經從一個ejb容器發展成為一個基於的j2ee的一個web 作業系統(operating system for web),它體現了j2ee規範中最新的技術,並且它還在the javaworld editors' choice 2002評選中獲得“最佳java應用伺服器”大獎。無論是學習還是應用,jboss為我們提供了一個非常優秀的平台。有關jboss的詳細資料請參閱其首頁http://www.jboss.org。
剛開始使用jboss進行ejb開發時,由於可供參考的資源不是很多,所以有一個比較困難的起步階段。jboss的配置和使用沒有提供圖形嚮導介面,所以開發部署ejb相對比較複雜。本文通過盡量具體的示範來對jboss3.0下的ejb開發和部署的進行一個簡單的介紹,從而使剛開始使用jboss的使用者可以很快地進入到真正的j2ee應用開發中。
由於本文主要介紹jboss3.0中不同類型ejb的配置和部署,不對基本的ejb開發做太多的描述,所以希望讀者具有j2ee和ejb的經驗。想要瞭解有關資訊請查閱參考資料1。
2.jboss3.0中基本的ejb配置和部署
根據j2ee規範的要求,一個基本的ejb jar包使用的描述檔案是ejb-jar.xml。web應用的war包使用的是web.xml。公司專屬應用程式的ear包使用的是application.xml。這些設定檔都是中性的和平台無關的。同時應用伺服器可以使用一些其他的設定檔用於描述特定伺服器的相關資訊。在jboss中這樣的檔案有jboss.xml,jboss-web.xml等。jboss容器中這些檔案不是必須的,如果提供了那麼jboss.xml和ejb-jar.xml放在同一目錄下,jboss-web.xml和web.xml放在同一目錄下。關於jboss.xml和jboss-web.xml的規範請參考jboss安裝目錄下docs/dtd/目錄下的對應的dtd檔案。
2.1 jboss中關於ejb用戶端的配置:
調用ejb的用戶端可以是jsp、servlet或用戶端應用程式。如果用戶端和伺服器不在同一個java vm上,那麼在用戶端必須提供一個jndi.properties檔案告訴用戶端進行有關jndi命名服務的資訊,並且把這個檔案所在目錄設定到環境變數classpath中。
以下是一個jndi.properties的範例:
java.naming.factory.initial=org.jnp.interfaces.namingcontextfactory
java.naming.provider.url=localhost:1099 (伺服器地址和連接埠號碼)
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
通過這個檔案和jboss的一些用戶端類庫,就可以使用jboss提供的ejb物件服務了。
2.2 jboss中部署ejb:
首先介紹jboss容器中部署各類ejb對象的兩種方法。下面的示範以session bean為例,用戶端是一個本機上的web應用。這裡不對示範程式進行具體介紹。
第一種方式:
把開發好的ejb jar包和web應用的war包公用放在deploy目錄下。
示範1:不需要jboss.xml檔案和其他任何特殊的設定。
ejb-jar.xml:
<ejb-jar>
······
<ejb-name>ejbtest</ejb-name>
······
</ejb-jar>
用戶端:web應用中對web.xml不需要添加ejb資訊,不需要jboss-web.xml檔案。引用ejb對象的jsp檔案如下:
······
initialcontext ctx = new initialcontext();
object objref = ctx.lookup("ejbtest"); //使用<ejb-name> beanhome=(zcxejb1home)portableremoteobject.narrow(objref,ejbtesthome.class);
······
示範2:使用jboss.xml檔案。
在預設情況下jboss的jndi服務將通過ejb-jar.xml中<ejb-name>xxx</ejb-name>中的xxx來使用ejb的home interface。但是如果有多個ejb對象在相同的ejb jar包中,在ejb-jar.xml中通過<ejb-name>xxx</ejb-name>就可能不能很好的表示某一個ejb對象,所以一般我們希望可以提供一些附加的資訊,例如採用這樣的格式"[應用程式名稱]/[bean名]"來引用一個ejb對象。這時jndi服務就可能不能正確地找到你的ejb對象,我們就需要使用jboss.xml檔案,通過它實現jndi 名到ejb名的重新導向。這個檔案必須和ejb-jar.xml一起放到meta-info目錄下。
ejb-jar.xml:
<ejb-jar>
······
<ejb-name>ejbtest</ejb-name>
······
</ejb-jar>
jboss.xml:
<jboss>
<ejb-name>ejbtest</ejb-name>
<jndi-name>example/ejbtest</jndi-name>
</jboss>
用戶端:需要使用新的jndi名進行ejb定位。
······
initialcontext ctx = new initialcontext();
object objref = ctx.lookup("example/ejbtest"); //使用<jndi-name> beanhome=(zcxejb1home)portableremoteobject.narrow(objref,ejbtesthome.class);
······
第二種方式:
把ejb和web應用程式套件裝成一個公司專屬應用程式包。部署ear時可以簡單地把通過application.xml描述ejb jar包和web應用的war包,同樣在web.war中不需要提供特殊的資訊就可以和第一種方式一樣使用ejb對象。用戶端代碼也不需要進行改動。這裡不再舉例說明。
web方式調用EJB:
J2EE應用/
|__EJB組件/(haiejb.jar)
| |__META-INF/
| | |__ejb-jar.xml
| | |__jboss.xml
| |__ejbs/
| |__HaiHome.class
| |__HaiClient.class
| |__HaiBean.class
|__WEB應用/(haiejb.war)
| |__haiejb.jsp
| |__WEB-INF/
| |__web.xml
| |__jboss-web.xml
|__META-INF/
|__application.xml
此外我們可以進行更進一步的部署,這時需要使用到web.xml和jboss-web.xml。jboss-web.xml是jboss提供的一個針對web應用進行配置的檔案。jboss-web.xml和web.xml一起放在web應用的web-inf目錄下。
示範1:改動web.xml檔案,添加<ejb-ref>標記,不使用jboss-web.xml檔案。
(注意<ejb-ref>包括內部引用和外部參考。如果是同一個單元的可以通過<ejb-link>直接進行引用,而不用提供其他資訊。)
web.xml:
······
<ejb-ref>
<ejb-ref-name>ejb/ejbtest</ejb-ref-name> <!--採用sun推薦的命名方式-->
<ejb-ref-type>session</ejb-ref-type>
<home>org.zcx.test.zcxejb1home</home>
<remote>org.zcx.test.zcxejb1</remote>
<ejb-link>ejbtest</ejb-link> <!--必須和被應用的ejb-name匹配-->
</ejb-ref>
······
用戶端:由於在web.xml中引入ejb引用描述這時ejb定位發生了變化:
······
initialcontext ctx = new initialcontext();
object objref = ctx.lookup("java:comp/env/ ejb/ejbtest "); //使用java:comp/env命名空間 beanhome=(zcxejb1home)portableremoteobject.narrow(objref,ejbtesthome.class);
······
示範2:聯合使用web.xml和jboss-web.xml
web.xml
······
<ejb-ref>
<ejb-ref-name>ejb/ejbtest</ejb-ref-name> <!--採用sun推薦的命名方式-->
<ejb-ref-type>session</ejb-ref-type>
<home>org.zcx.test.zcxejb1home</home>
<remote>org.zcx.test.zcxejb1</remote>
</ejb-ref>
······
jboss-web.xml
<ejb-ref>
<ejb-ref-name> ejb/ejbtest </ejb-ref-name>
<jndi-name> example/ejbtest </jndi-name> <!-- 這裡對應ejb對象的jndi名-->
</ejb-ref>
用戶端:
nitialcontext ctx = new initialcontext();
object objref = ctx.lookup("java:comp/env/ ejb/ejbtest "); beanhome=(zcxejb1home)portableremoteobject.narrow(objref,ejbtesthome.class);
以上的所有示範說明了ejb-jar.xml、jboss.xml、web.xml、jboss-web.xml之間的基本關係和它們的使用方式。它們是部署各類ejb對象的關鍵檔案。接下來介紹針對不同類型的ejb對象所需要的特殊配置。
3.jboss3.0中對於cmp2.0 entity bean的有關配置
jboss3.0中jbosscmp引擎實現了ejb2.0 cmp2.0規範。jboss3.0以前的版本cmp的引擎是jaws,它通過standardjaws.xml和jaws.xml進行有關的配置。在新的jbosscmp引擎中jboss3.0通過standardjbosscmp-jdbc.xml和josscmp-jdbc.xml來配置entity bean。jboss3.0首先處理standardjbosscmp-jdbc.xml然後根據ejb jar中是否提供jbosscmp-jdbc.xml來做進一步處理。通過standardjbosscmp-jdbc.xml和jbosscmp-jdbc.xml可以為entity bean的部署提供如下的功能有:
l 指定所使用的資料來源和對應的類型映射
l 指定一些引擎關心的屬性
l 指定引擎如何建立和管理資料庫表的原則
l 描述finder和ejbselect方法
l 指定屬性和欄位的類型映射
這裡主要根據standardjbosscmp-jdbc.xml/jbosscmp-jdbc.xml介紹cmp2.0的配置方法。jboss中原有的jaws引擎的配置方法和新的jbosscmp的配置方法類似。這些檔案的具體的資訊可以參考jboss安裝路徑下/docs/dtd中對應的dtd檔案。
3.1增加新的資料來源
jboss內建的資料庫是hypersonic資料庫,我們可以增加一些新的資料來源。具體的步驟很簡單,參照jboss安裝目錄下/docs/examples/jca中的*-service.xml檔案可以增加找到對應類型的資料庫配置樣本檔案。以mysql-service.xml檔案為例,它可以配置一個mysql資料庫作為entity bean的資料來源。以下示範建立一個名為mysqlds的mysql資料來源。
圖一是配置好的mysql-service.xml檔案的一段代碼樣本,通過屬性設定可以定製資料來源的名稱和有關串連的其他屬性。注意該檔案中所有name屬性必須保持一致。
圖一 mysql-servic.xml的樣本代碼
在配置好這個檔案後,把它部署在jboss的deploy目錄下,把對應的jdbc驅動也放在lib目錄下。重新啟動jboss就會載入這個新的資料來源。
3.2 entity bean 對資料來源的使用
第一種方式:
直接改動standardjbosscmp-jdbc.xml。把原有的資料來源java:/defautlds屏蔽掉使用新的資料來源java:/mysqlds。(java首碼是必須的。)不需在其他地方作改動。jboss會實現新的資料來源做為預設的資料來源。圖二是一個配置好的檔案片斷。
圖二 standardjbosscmp-jdbc.xml的樣本代碼
第二種方式:
由於有可能不同的entity bean使用不同的資料來源,而不是都使用同樣的預設配置,所以必須為單獨的entity bean提供定製資料來源資訊的支援。這時不需要改動standardjbosscmp-jdbc.xml檔案,可以通過在entity bean的jar包中meta-info目錄下添加新的部署檔案jbosscmp-jdbc.xml來完成。通過這個檔案可以描述特定的entity bean的關於資料來源的配置資訊。圖三是一個配置好的檔案片斷。
圖三 jbosscmp-jdbc.xml的樣本代碼
4.jboss3.0中對於message driven bean的配置
在jboss中開發mdb需要使用jms功能。jms是sun公司開發的面向訊息的中介軟體api。它的主要目的是創造一種統一的面向訊息編程的javaapi,從而避免使用供應商特定的api。現在有幾種不同的jms系統可供使用。jboss3.0中提供的是jbossmq。
4.1 jboss3.0中配置jms服務
在jboss3.0中與jms服務相關的設定檔包括兩個檔案:jbossmq-service.xml和jbossmq-destinations-service.xml。jbossmq-service.xml配置了jbossmq服務中的核心對象資訊。一般我們不需要處理這個設定檔。jbossmq-destinations-service.xml用於定義具體應用所需的目的地資訊。通過編輯它我們可以建立新的topic和queue用於具體的jms應用的目的地。在jboss中建立應用特定的topic和queues的步驟比較簡單,參照jbossmq-destinations-service.xml檔案格式在該檔案中添加自己應用程式所需的topic名為mytestapptopic和queue名為mytestappqueue。四所示。
圖四 jbossmq-destinations-service.xml的樣本代碼
4.2 jboss3.0中ejb使用jms服務的配置
在開發mdb 時要在部署檔案中指定所使用的jms服務中的目的地資訊。jboss中通過ejb-jar.xml和jboss.xml共同說明。在jboss.xml中通過<destination-jndi-name>標記描述所使用的目的地資訊。
ejb-jar.xml
<message-driven>
<ejb-name>hellotopicmdb</ejb-name>
<ejb-class>org.zcx.test.hellomdb</ejb-class>
<message-selector></message-selector>
<transaction-type>container</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.topic</destination-type>
<subscription-durability>nondurable</subscription-durability>
</message-driven-destination>
</message-driven>
jboss.xml
<message-driven>
<ejb-name>hellotopicmdb</ejb-name>
<configuration-name>standard message driven bean</configuration-name>
<destination-jndi-name>topic/myapptesttopic</destination-jndi-name>
</message-driven>
用戶端:
······
context context = new initialcontext();
// get the connection factory
// create the connection
// create the session
······
// look up the destination
topic = (topic)context.lookup("topic/mytestapptopic");
// create a publisher
// publish the message
······
5.jboss3.0中ejb使用javamail服務的配置。
由於jboss提供了javamail服務的實現,所以在jboss中使用javamail是非常方便地。它所需要配置的是mail.service檔案。這個檔案非常地簡單不用多介紹。按照mail.service檔案的的注釋就可以順利地完成配置。
圖五是使用javamail服務的一個sessionbean的代碼片斷
圖五 使用javamail的樣本代碼
以上通過例子簡單的介紹了jboss3.0中session bean、entity bean 和message drive bean 最基本的配置和部署方法,通過這些介紹現在已經可以在jboss中進行基本的ejb應用的開發了。本文中對於ejb應用中比較複雜的一些配置像使用權限設定、資源管理和cmp2.0中的眾多配置等都沒有涉及到,希望大家可以在不斷的實踐和交流中更好地掌握jboss的使用和配置。