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