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
中不同類(lèi)型
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
的一些客戶端類(lèi)庫(kù),就可以使用
JBoss
提供的
EJB
對(duì)象服務(wù)了。
2.2 JBoss中部署EJB:
首先介紹
JBoss
容器中部署各類(lèi)
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)系和它們的使用方式。它們是部署各類(lèi)
ejb
對(duì)象的關(guān)鍵文件。接下來(lái)介紹針對(duì)不同類(lèi)型的
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èi)型映射
l????????
指定一些引擎關(guān)心的屬性
l????????
指定引擎如何創(chuàng)建和管理數(shù)據(jù)庫(kù)表的原則
l????????
描述
finder
和
ejbSelect
方法
l????????
指定屬性和字段的類(lèi)型映射
這里主要根據(jù)
standardjbosscmp-jdbc.xml/jbosscmp-jdbc.xml
介紹
CMP2.0
的配置方法。
JBoss
中原有的
Jaws
引擎的配置方法和新的
JBossCMP
的配置方法類(lèi)似。這些文件的具體的信息可以參考
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)類(lèi)型的數(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ù)源的名稱(chēng)和有關(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
的使用和配置。