個(gè)人心得
這段時(shí)間一直在修改ECperf,主要心得都是EJB應(yīng)用方面的,對(duì)EJB部署的復(fù)雜和調(diào)試的痛苦深有感觸,其中主要原因可能是我對(duì)EJB不太熟悉,沒(méi)有用EJB開(kāi)發(fā)應(yīng)用的經(jīng)驗(yàn),以下的幾點(diǎn)心得在熟手看來(lái)可能是理所當(dāng)然的,但卻折磨我了好久。
1.
EJB部署
部署應(yīng)用實(shí)際上就是將應(yīng)用安裝到應(yīng)用服務(wù)器上,按書(shū)上部署Hell Word時(shí)沒(méi)有遇到絲毫困難,但在部署ECperf時(shí)卻冒出了一堆問(wèn)題。其中困擾我最久的就是EJB互相引用的問(wèn)題,實(shí)際上只需要將所有的引用關(guān)系和JNDI名寫(xiě)入sun-ejb-jar.xml就可以了(借助sun的部署工具很容易實(shí)現(xiàn),不同的應(yīng)用服務(wù)器會(huì)有不同的文件名如,格式可能也會(huì)不同)。在ejb-jar.xml中,每個(gè)EJB必須申明自己引用的EJB的類型,home接口,remote接口,和ejb的引用名,引用名不需要與JNDI名相同,在sun-ejb-jar.xml要申明ejb引用名對(duì)應(yīng)的JNDI名。DataSource也需要如此設(shè)置,對(duì)于env-entry好像不需要在sun-ejb-jar.xml中申明。由此可以看出應(yīng)用服務(wù)器對(duì)EJB所能訪問(wèn)的資源做了嚴(yán)格的控制,而ejb不是直接引用JNDI名,也為ejb應(yīng)用提供了一定的靈活性。
2.
EJB調(diào)用
在同一容器調(diào)用EJB和遠(yuǎn)程調(diào)用EJB有很大不同。同一容器中調(diào)用者與被調(diào)用者有相同的Context,因此不需要額外設(shè)置,而在遠(yuǎn)程調(diào)用需要指定java.naming.factory.initial和java.naming.provider.url,另外還要部署時(shí)產(chǎn)生的client
jar。
在調(diào)用PortableRemoteObject.narrow()得到home接口時(shí)拋出java.lang.ClassCastException
一般將client
jar 放到 classpath中就可以解決,這里主要用到的是remote接口和home接口的stub。如果不將client jar 放到classpath中也可以得到home的接口,但由于使用了不同的classload,在用PortableRemoteObject.narrow()進(jìn)行轉(zhuǎn)型被視為不同的類而轉(zhuǎn)型失敗,我在用sun的部署工具得到的
client jar中竟然沒(méi)有stub(可能是部署文件的問(wèn)題),所以遠(yuǎn)程調(diào)用始終不成功。
3.
下一步學(xué)習(xí)的方向
繼續(xù)研究遠(yuǎn)程對(duì)象是如何返回的
Classload 是如何工作的
JDBC中關(guān)于分布式事務(wù)的處理方式
容器處理事務(wù)的規(guī)則
posted on 2005-08-23 23:04
JBahamut 閱讀(1717)
評(píng)論(0) 編輯 收藏