個(gè)人心得
這段時(shí)間一直在修改ECperf,主要心得都是EJB應(yīng)用方面的,對EJB部署的復(fù)雜和調(diào)試的痛苦深有感觸,其中主要原因可能是我對EJB不太熟悉,沒有用EJB開發(fā)應(yīng)用的經(jīng)驗(yàn),以下的幾點(diǎn)心得在熟手看來可能是理所當(dāng)然的,但卻折磨我了好久。
1.
EJB部署
部署應(yīng)用實(shí)際上就是將應(yīng)用安裝到應(yīng)用服務(wù)器上,按書上部署Hell Word時(shí)沒有遇到絲毫困難,但在部署ECperf時(shí)卻冒出了一堆問題。其中困擾我最久的就是EJB互相引用的問題,實(shí)際上只需要將所有的引用關(guān)系和JNDI名寫入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引用名對應(yīng)的JNDI名。DataSource也需要如此設(shè)置,對于env-entry好像不需要在sun-ejb-jar.xml中申明。由此可以看出應(yīng)用服務(wù)器對EJB所能訪問的資源做了嚴(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中竟然沒有stub(可能是部署文件的問題),所以遠(yuǎn)程調(diào)用始終不成功。
3.
下一步學(xué)習(xí)的方向
繼續(xù)研究遠(yuǎn)程對象是如何返回的
Classload 是如何工作的
JDBC中關(guān)于分布式事務(wù)的處理方式
容器處理事務(wù)的規(guī)則