JBoss3.0 下配置和部署 EJB 簡(jiǎn)介
1.JBoss簡(jiǎn)介
JBoss
是一個(gè)運(yùn)行
EJB
的
J2EE
應(yīng)用服務(wù)器。它是開(kāi)放源代碼的項(xiàng)目,遵循最新的
J2EE
規(guī)范。從
JBoss
項(xiàng)目開(kāi)始至今,它已經(jīng)從一個(gè)
EJB
容器發(fā)展成為一個(gè)基于的
J2EE
的一個(gè)
web
操作系統(tǒng)(
operating system for web
),它體現(xiàn)了
J2EE
規(guī)范中最新的技術(shù),并且它還在
the JavaWorld Editors' Choice 2002
評(píng)選中獲得“最佳
Java
應(yīng)用服務(wù)器”大獎(jiǎng)。無(wú)論是學(xué)習(xí)還是應(yīng)用,
JBoss
為我們提供了一個(gè)非常優(yōu)秀的平臺(tái)。有關(guān)
JBoss
的詳細(xì)信息請(qǐng)參閱其主頁(yè)
http://www.jboss.org
。
?????? 剛開(kāi)始使用 JBoss 進(jìn)行 EJB 開(kāi)發(fā)時(shí),由于可供參考的資源不是很多,所以有一個(gè)比較困難的起步階段。 JBoss 的配置和使用沒(méi)有提供圖形向?qū)Ы缑妫蚤_(kāi)發(fā)部署 EJB 相對(duì)比較復(fù)雜。本文通過(guò)盡量具體的演示來(lái)對(duì) JBoss3.0 下的 EJB 開(kāi)發(fā)和部署的進(jìn)行一個(gè)簡(jiǎn)單的介紹,從而使剛開(kāi)始使用 JBoss 的用戶可以很快地進(jìn)入到真正的 J2EE 應(yīng)用開(kāi)發(fā)中。
由于本文主要介紹 JBoss3.0 中不同類型 EJB 的配置和部署,不對(duì)基本的 EJB 開(kāi)發(fā)做太多的描述,所以希望讀者具有 J2EE 和 EJB 的經(jīng)驗(yàn)。想要了解有關(guān)信息請(qǐng)查閱參考資料 1 。
2.JBoss3.0中基本的ejb配置和部署
根據(jù) J2EE 規(guī)范的要求,一個(gè)基本的 ejb jar 包使用的描述文件是 ejb-jar.xml 。 web 應(yīng)用的 war 包使用的是 web.xml 。企業(yè)應(yīng)用的 ear 包使用的是 application.xml 。這些配置文件都是中性的和平臺(tái)無(wú)關(guān)的。同時(shí)應(yīng)用服務(wù)器可以使用一些其他的配置文件用于描述特定服務(wù)器的相關(guān)信息。在 JBoss 中這樣的文件有 jboss.xml , jboss-web.xml 等。 JBoss 容器中這些文件不是必須的,如果提供了那么 jboss.xml 和 ejb-jar.xml 放在同一目錄下, jboss-web.xml 和 web.xml 放在同一目錄下。關(guān)于 jboss.xml 和 jboss-web.xml 的規(guī)范請(qǐng)參考 JBoss 安裝目錄下 docs/dtd/ 目錄下的對(duì)應(yīng)的 DTD 文件。
2.1 JBoss中關(guān)于EJB客戶端的配置:
調(diào)用 EJB 的客戶端可以是 JSP 、 Servlet 或客戶端應(yīng)用程序。如果客戶端和服務(wù)器不在同一個(gè) Java VM 上,那么在客戶端必須提供一個(gè) jndi.properties 文件告訴客戶端進(jìn)行有關(guān) JNDI 命名服務(wù)的信息,并且把這個(gè)文件所在目錄設(shè)定到環(huán)境變量 classpath 中。
以下是一個(gè) jndi.properties 的樣例:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099? ( 服務(wù)器地址和端口號(hào) )
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
通過(guò)這個(gè)文件和 JBoss 的一些客戶端類庫(kù),就可以使用 JBoss 提供的 EJB 對(duì)象服務(wù)了。
2.2 JBoss中部署EJB:
首先介紹 JBoss 容器中部署各類 EJB 對(duì)象的兩種方法。下面的演示以 Session Bean 為例,客戶端是一個(gè)本機(jī)上的 web 應(yīng)用。這里不對(duì)演示程序進(jìn)行具體介紹。
第一種方式:
把開(kāi)發(fā)好的 ejb jar 包和 web 應(yīng)用的 war 包公共放在 deploy 目錄下。
演示 1 :不需要 jboss.xml 文件和其他任何特殊的設(shè)置。
ejb-jar.xml:
<ejb-jar>
?????? ······
????????????? <ejb-name>ejbtest</ejb-name>
?????? ······
</ejb-jar>
客戶端: web 應(yīng)用中對(duì) web.xml 不需要添加 ejb 信息,不需要 jboss-web.xml 文件。引用 ejb 對(duì)象的 jsp 文件如下:
?????? ······
?????? InitialContext ctx = new InitialContext();
?????? Object objref? = ctx.lookup("ejbtest");??????? //
使用
<ejb-name>
????? ?beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
?????? ······
?
演示 2 :使用 jboss.xml 文件。
在缺省情況下 JBoss 的 JNDI 服務(wù)將通過(guò) ejb-jar.xml 中 <ejb-name>XXX</ejb-name> 中的 XXX 來(lái)使用 EJB 的 home interface 。但是如果有多個(gè) ejb 對(duì)象在相同的 ejb jar 包中,在 ejb-jar.xml 中通過(guò) <ejb-name>XXX</ejb-name> 就可能不能很好的表示某一個(gè) ejb 對(duì)象,所以一般我們希望可以提供一些附加的信息,例如采用這樣的格式 "[ 應(yīng)用名 ]/[bean 名 ]" 來(lái)引用一個(gè) EJB 對(duì)象。這時(shí) JNDI 服務(wù)就可能不能正確地找到你的 ejb 對(duì)象,我們就需要使用 jboss.xml 文件,通過(guò)它實(shí)現(xiàn) jndi 名到 ejb 名的重定向。這個(gè)文件必須和 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 名進(jìn)行 ejb 定位。
······
?????? InitialContext ctx = new InitialContext();
?????? Object objref? = ctx.lookup("example/ejbtest");?? //
使用
<jndi-name>????????????????????????????
?????? beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
······
第二種方式:
把 ejb 和 web 應(yīng)用包裝成一個(gè)企業(yè)應(yīng)用包。部署 ear 時(shí)可以簡(jiǎn)單地把通過(guò) application.xml 描述 ejb jar 包和 web 應(yīng)用的 war 包,同樣在 web.war 中不需要提供特殊的信息就可以和第一種方式一樣使用 ejb 對(duì)象。客戶端代碼也不需要進(jìn)行改動(dòng)。這里不再舉例說(shuō)明。
此外我們可以進(jìn)行更進(jìn)一步的部署,這時(shí)需要使用到 web.xml 和 jboss-web.xml 。 jboss-web.xml 是 JBoss 提供的一個(gè)針對(duì) web 應(yīng)用進(jìn)行配置的文件。 jboss-web.xml 和 web.xml 一起放在 web 應(yīng)用的 WEB-INF 目錄下。
演示 1 :改動(dòng) web.xml 文件,添加 <ejb-ref> 標(biāo)記,不使用 jboss-web.xml 文件。
(注意 <ejb-ref> 包括內(nèi)部引用和外部引用。如果是同一個(gè)單元的可以通過(guò) <ejb-link> 直接進(jìn)行引用,而不用提供其他信息。)
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>??? <!-- 必須和被應(yīng)用的 ejb-name 匹配 -->
</ejb-ref>
······
客戶端:由于在 web.xml 中引入 ejb 引用描述這時(shí) ejb 定位發(fā)生了變化:
······
?????? InitialContext ctx = new InitialContext();
?????? Object objref? = ctx.lookup("java:comp/env/ ejb/ejbtest ");// 使用 java:comp/env 命名空間 ?????? beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
······
?
演示 2 :聯(lián)合使用 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> <!-- 這里對(duì)應(yīng) ejb 對(duì)象的 jndi 名 -->
</ejb-ref>
客戶端:
?????? nitialContext ctx = new InitialContext();
?????? Object objref? = ctx.lookup("java:comp/env/ ejb/ejbtest ");??????? ??????????????????????????? ?????? beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
?
以上的所有演示說(shuō)明了 ejb-jar.xml 、 jboss.xml 、 web.xml 、 jboss-web.xml 之間的基本關(guān)系和它們的使用方式。它們是部署各類 ejb 對(duì)象的關(guān)鍵文件。接下來(lái)介紹針對(duì)不同類型的 ejb 對(duì)象所需要的特殊配置。
3.JBoss3.0中對(duì)于CMP2.0 Entity Bean的有關(guān)配置
JBoss3.0 中 JBossCMP 引擎實(shí)現(xiàn)了 EJB2.0 CMP2.0 規(guī)范。 JBoss3.0 以前的版本 CMP 的引擎是 Jaws ,它通過(guò) standardjaws.xml 和 jaws.xml 進(jìn)行有關(guān)的配置。在新的 JBossCMP 引擎中 Jboss3.0 通過(guò) standardjbosscmp-jdbc.xml 和 josscmp-jdbc.xml 來(lái)配置 Entity Bean 。 JBoss3.0 首先處理 standardjbosscmp-jdbc.xml 然后根據(jù) ejb jar 中是否提供 jbosscmp-jdbc.xml 來(lái)做進(jìn)一步處理。通過(guò) standardjbosscmp-jdbc.xml 和 jbosscmp-jdbc.xml 可以為 entity bean 的部署提供如下的功能有:
l???????? 指定所使用的數(shù)據(jù)源和對(duì)應(yīng)的類型映射
l???????? 指定一些引擎關(guān)心的屬性
l???????? 指定引擎如何創(chuàng)建和管理數(shù)據(jù)庫(kù)表的原則
l???????? 描述 finder 和 ejbSelect 方法
l???????? 指定屬性和字段的類型映射
這里主要根據(jù) standardjbosscmp-jdbc.xml/jbosscmp-jdbc.xml 介紹 CMP2.0 的配置方法。 JBoss 中原有的 Jaws 引擎的配置方法和新的 JBossCMP 的配置方法類似。這些文件的具體的信息可以參考 JBoss 安裝路徑下 \docs\dtd 中對(duì)應(yīng)的 DTD 文件。
3.1增加新的數(shù)據(jù)源
JBoss 自帶的數(shù)據(jù)庫(kù)是 Hypersonic 數(shù)據(jù)庫(kù),我們可以增加一些新的數(shù)據(jù)源。具體的步驟很簡(jiǎn)單,參照 Jboss 安裝目錄下 \docs\examples\jca 中的 *-service.xml 文件可以增加找到對(duì)應(yīng)類型的數(shù)據(jù)庫(kù)配置樣本文件。以 mysql-service.xml 文件為例,它可以配置一個(gè) MySQL 數(shù)據(jù)庫(kù)作為 Entity Bean 的數(shù)據(jù)源。以下演示創(chuàng)建一個(gè)名為 MySQLDS 的 MySQL 數(shù)據(jù)源。
圖一是配置好的 mysql-service.xml 文件的一段代碼樣本,通過(guò)屬性設(shè)置可以定制數(shù)據(jù)源的名稱和有關(guān)連接的其他屬性。注意該文件中所有 name 屬性必須保持一致。
圖一
mysql-servic.xml
的樣本代碼
在配置好這個(gè)文件后,把它部署在 JBoss 的 deploy 目錄下,把對(duì)應(yīng)的 jdbc 驅(qū)動(dòng)也放在 lib 目錄下。重新啟動(dòng) Jboss 就會(huì)加載這個(gè)新的數(shù)據(jù)源。
3.2 Entity Bean 對(duì)數(shù)據(jù)源的使用
第一種方式:
直接改動(dòng) standardjbosscmp-jdbc.xml 。把原有的數(shù)據(jù)源 java:/DefautlDS 屏蔽掉使用新的數(shù)據(jù)源 java:/MySQLDS 。( Java 前綴是必須的。)不需在其他地方作改動(dòng)。 JBoss 會(huì)實(shí)現(xiàn)新的數(shù)據(jù)源做為缺省的數(shù)據(jù)源。圖二是一個(gè)配置好的文件片斷。
圖二
standardjbosscmp-jdbc.xml
的樣本代碼
第二種方式:
由于有可能不同的 Entity Bean 使用不同的數(shù)據(jù)源,而不是都使用同樣的缺省配置,所以必須為單獨(dú)的 Entity Bean 提供定制數(shù)據(jù)源信息的支持。這時(shí)不需要改動(dòng) standardjbosscmp-jdbc.xml 文件,可以通過(guò)在 Entity Bean 的 jar 包中 META-INFO 目錄下添加新的部署文件 jbosscmp-jdbc.xml 來(lái)完成。通過(guò)這個(gè)文件可以描述特定的 Entity Bean 的關(guān)于數(shù)據(jù)源的配置信息。圖三是一個(gè)配置好的文件片斷。
圖三 jbosscmp-jdbc.xml 的樣本代碼
4.JBoss3.0中對(duì)于Message Driven Bean的配置
在 JBoss 中開(kāi)發(fā) MDB 需要使用 JMS 功能。 JMS 是 Sun 公司開(kāi)發(fā)的面向消息的中間件 API 。它的主要目的是創(chuàng)造一種統(tǒng)一的面向消息編程的 JavaAPI ,從而避免使用提供商特定的 API 。現(xiàn)在有幾種不同的 JMS 系統(tǒng)可供使用。 JBoss3.0 中提供的是 JBossMQ 。
4.1 JBoss3.0中配置JMS服務(wù)
在 JBoss3.0 中與 JMS 服務(wù)相關(guān)的配置文件包括兩個(gè)文件: jbossMQ-service.xml 和 jbossMQ-destinations-service.xml 。 jbossMQ-service.xml 配置了 jbossMQ 服務(wù)中的核心對(duì)象信息。一般我們不需要處理這個(gè)配置文件。 jbossMQ-destinations-service.xml 用于定義具體應(yīng)用所需的目的地信息。通過(guò)編輯它我們可以創(chuàng)建新的 Topic 和 Queue 用于具體的 JMS 應(yīng)用的目的地。在 JBoss 中創(chuàng)建應(yīng)用特定的 Topic 和 Queues 的步驟比較簡(jiǎn)單,參照 jbossMQ-destinations-service.xml 文件格式在該文件中添加自己應(yīng)用程序所需的 Topic 名為 myTestAppTopic 和 Queue 名為 myTestAppQueue 。如圖四所示。
圖四 ? jbossMQ-destinations-service.xml 的樣本代碼
4.2 JBoss3.0中EJB使用JMS服務(wù)的配置
在開(kāi)發(fā) MDB 時(shí)要在部署文件中指定所使用的 JMS 服務(wù)中的目的地信息。 JBoss 中通過(guò) ejb-jar.xml 和 jboss.xml 共同說(shuō)明。在 jboss.xml 中通過(guò) <destination-jndi-name> 標(biāo)記描述所使用的目的地信息。
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服務(wù)的配置。
由于 JBoss 提供了 JavaMail 服務(wù)的實(shí)現(xiàn),所以在 JBoss 中使用 JavaMail 是非常方便地。它所需要配置的是 mail.service 文件。這個(gè)文件非常地簡(jiǎn)單不用多介紹。按照 mail.service 文件的的注釋就可以順利地完成配置。
圖五是使用 JavaMail 服務(wù)的一個(gè) sessionBean 的代碼片斷
圖五 ? 使用 javamail 的樣本代碼
?
?
以上通過(guò)例子簡(jiǎn)單的介紹了 JBoss3.0 中 Session Bean 、 Entity Bean 和 Message Drive Bean 最基本的配置和部署方法,通過(guò)這些介紹現(xiàn)在已經(jīng)可以在 JBoss 中進(jìn)行基本的 EJB 應(yīng)用的開(kāi)發(fā)了。本文中對(duì)于 EJB 應(yīng)用中比較復(fù)雜的一些配置像權(quán)限設(shè)置、資源管理和 CMP2.0 中的眾多配置等都沒(méi)有涉及到,希望大家可以在不斷的實(shí)踐和交流中更好地掌握 JBoss 的使用和配置。