如何通過(guò)遠(yuǎn)程客戶端跨JVM遠(yuǎn)程訪問(wèn)EJB
對(duì)于EJB主要指(SessionBean)大體上有三種客戶端,即本地客戶端,遠(yuǎn)程客戶端和web服務(wù)客戶端。
所謂本地客戶端,就是其必須與所要訪問(wèn)的的Bean在同一個(gè)JVM中,對(duì)于遠(yuǎn)程客戶端無(wú)此限制,可以在同一個(gè)JVM中,也可以不在同一個(gè)JVM中。Web服務(wù)客戶端也可以以兩種方式來(lái)訪問(wèn)Bean,但僅限于無(wú)狀態(tài)會(huì)話Bean,消息驅(qū)動(dòng)Bean則不可以。而對(duì)于客戶端的形式,則無(wú)要求,可以是web客戶端,普通java應(yīng)用客戶端或其他的Bean。
本次討論的是EJB的遠(yuǎn)程客戶端,且客戶端與Bean在不同的JVM中的調(diào)用方式。環(huán)境為兩個(gè)xp,MyEclipse6.0,JBoss5。還是簡(jiǎn)單的Hello World的例子。不是Hello fancy !呼呼 !
1.首先寫(xiě)遠(yuǎn)程接口如下:
|
2.寫(xiě)B(tài)ean類(lèi)實(shí)現(xiàn)遠(yuǎn)程接口:
|
3.利用MyEclipse打包,將遠(yuǎn)程接口和Bean類(lèi)打成helloworld.jar
4.部署EJB,即將helloworld.jar直接copy到D:\jboss5\server\default\deploy下。
5.寫(xiě)客戶端代碼如下:
package client; |
6.創(chuàng)建JNDI配置文件context-config.properties如下:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory |
7.在IDE中直接運(yùn)行客戶端測(cè)試程序,輸出如下:
Hello ,fancy! |
8.將客戶端程序連同配置文件一同打包,并連同所需jar包,放到另外一臺(tái)xp上測(cè)試。
java -Djava.ext.dirs=D:\clientlib client.TestHello |
結(jié)果拋如下異常:
javax.naming.CommunicationException [java.rmi.ConnectException: Connection refused to host。。。 |
根據(jù)前輩的帖子指點(diǎn):
客戶端程序向服務(wù)端請(qǐng)求一個(gè)對(duì)象的時(shí)候,返回的stub對(duì)象里面包含了服務(wù)器的hostname,客戶端的后續(xù)操作根據(jù)這個(gè)
hostname來(lái)連接服務(wù)器端。
解決方式如下:
(1).修改hostname. |
(2)在啟動(dòng)jboss時(shí)顯示指定hostname. |
我用了(2),因?yàn)槲业氖莤p嗎。第一種方式對(duì)應(yīng)到windows/system32/drivers/etc/hosts文件,怎么修改都不好用。
第二種方式可行:?jiǎn)?dòng)JBoss命令如下:
run -b192.168.1.108 或 run --host=192.168.1.108。 |
結(jié)果在另一臺(tái)xp上看到:
Hello ,fancy! |
至此終于實(shí)現(xiàn)了跨JVM遠(yuǎn)程訪問(wèn)EJB。
【編輯推薦】