1 RMI宸ヤ綔鍘熺悊
2 websphere瀹炵幇
3 weblogic瀹炵幇
4 鐞嗚В浣撲細
1錛歊MI宸ヤ綔鍘熺悊
RMI鐨勬湰璐ㄥ氨鏄疄鐜板湪涓嶅悓JVM涔嬮棿鐨勮皟鐢?瀹冪殑瀹炵幇鏂規(guī)硶灝辨槸鍦ㄤ袱涓狫VM涓悇寮涓涓猄tub鍜孲keleton錛屼簩鑰呴氳繃socket閫氫俊鏉ュ疄鐜板弬鏁板拰榪斿洖鍊肩殑浼犻掋?
鏈夊叧RMI鐨勪緥瀛愪唬鐮佺綉涓婂彲浠ユ壘鍒頒笉灝戯紝浣嗙粷澶ч儴鍒嗛兘鏄氳繃extend the interface java.rmi.Remote瀹炵幇錛屽凡緇忓皝瑁呯殑寰堝畬鍠勪簡錛屼笉鍏嶄嬌浜烘湁闆鵑噷鐪嬭姳鐨勬劅瑙夈備笅闈㈢殑渚嬪瓙鏄垜鍦ㄣ奅nterprise JavaBeans銆嬮噷鐪嬪埌鐨勶紝铏界劧寰堢矖緋欙紝浣嗗緢鐩磋錛屽埄浜庡緢蹇簡瑙e畠鐨勫伐浣滃師鐞嗐?
1. 瀹氫箟涓涓狿erson鐨勬帴鍙o紝鍏朵腑鏈変袱涓猙usiness method, getAge() 鍜実etName()
浠g爜:
public interface Person {
public int getAge() throws Throwable;
public String getName() throws Throwable;
}
2. Person鐨勫疄鐜癙ersonServer綾?
浠g爜:
public class PersonServer implements Person {
int age;
String name;
public PersonServer(String name, int age) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
3. 濂斤紝鎴戜滑鐜板湪瑕佸湪Client鏈哄櫒涓婅皟鐢╣etAge()鍜実etName()榪欎袱涓猙usiness
method錛岄偅涔堝氨寰楃紪鍐欑浉搴旂殑Stub(Client绔?鍜孲keleton(Server绔?紼嬪簭銆傝繖鏄疭tub鐨勫疄鐜幫細
浠g爜:
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
public class Person_Stub implements Person {
Socket socket;
public Person_Stub() throws Throwable {
// connect to skeleton
socket = new Socket("computer_name", 9000);
}
public int getAge() throws Throwable {
// pass method name to skeleton
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream());
outStream.writeObject("age");
outStream.flush();
ObjectInputStream inStream =
new ObjectInputStream(socket.getInputStream());
return inStream.readInt();
}
public String getName() throws Throwable {
// pass method name to skeleton
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream());
outStream.writeObject("name");
outStream.flush();
ObjectInputStream inStream =
new ObjectInputStream(socket.getInputStream());
return (String)inStream.readObject();
}
}
娉ㄦ剰錛孭erson_Stub鍜孭ersonServer涓鏍鳳紝閮絠mplements
Person銆傚畠浠兘瀹炵幇浜唃etAge()鍜実etName()涓や釜business
method錛屼笉鍚岀殑鏄疨ersonServer鏄湡鐨勫疄鐜幫紝Person_Stub鏄緩绔媠ocket榪炴帴錛屽茍鍚慡keleton鍙戣姹傦紝鐒跺悗閫氳繃
Skeleton璋冪敤PersonServer鐨勬柟娉曪紝鏈鍚庢帴鏀惰繑鍥炵殑緇撴灉銆?
4. Skeleton瀹炵幇
浠g爜:
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.ServerSocket;
public class Person_Skeleton extends Thread {
PersonServer myServer;
public Person_Skeleton(PersonServer server) {
// get reference of object server
this.myServer = server;
}
public void run() {
try {
// new socket at port 9000
ServerSocket serverSocket = new ServerSocket(9000);
// accept stub's request
Socket socket = serverSocket.accept();
while (socket != null) {
// get stub's request
ObjectInputStream inStream =
new ObjectInputStream(socket.getInputStream());
String method = (String)inStream.readObject();
// check method name
if (method.equals("age")) {
// execute object server's business method
int age = myServer.getAge();
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream());
// return result to stub
outStream.writeInt(age);
outStream.flush();
}
if(method.equals("name")) {
// execute object server's business method
String name = myServer.getName();
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream());
// return result to stub
outStream.writeObject(name);
outStream.flush();
}
}
} catch(Throwable t) {
t.printStackTrace();
System.exit(0);
}
}
public static void main(String args []) {
// new object server
PersonServer person = new PersonServer("Richard", 34);
Person_Skeleton skel = new Person_Skeleton(person);
skel.start();
}
}
Skeleton綾?extends from Thread錛屽畠闀塊┗鍦ㄥ悗鍙拌繍琛岋紝闅忔椂鎺ユ敹client鍙戣繃鏉ョ殑request銆傚茍鏍規(guī)嵁鍙戦佽繃鏉ョ殑
key鍘昏皟鐢ㄧ浉搴旂殑business method銆?
5. 鏈鍚庝竴涓紝Client鐨勫疄鐜?
浠g爜:
public class PersonClient {
public static void main(String [] args) {
try {
Person person = new Person_Stub();
int age = person.getAge();
String name = person.getName();
System.out.println(name + " is " + age + " years old");
} catch(Throwable t) {
t.printStackTrace();
}
}
}
Client鐨勬湰璐ㄦ槸錛屽畠瑕佺煡閬揚erson鎺ュ彛鐨勫畾涔夛紝騫跺疄渚嬩竴涓狿erson_Stub錛岄氳繃Stub鏉ヨ皟鐢╞usiness method錛?/p>
鑷充簬Stub鎬庝箞鍘誨拰Server娌熼氾紝Client灝變笉鐢ㄧ浜嗐?
娉ㄦ剰瀹冪殑鍐欐硶錛?
Person person = new Person_Stub();
鑰屼笉鏄?
Person_Stub person = new Person_Stub();
涓轟粈涔堬紵鍥犱負瑕侀潰鍚戞帴鍙g紪紼嬪槢錛屽懙鍛點?/p>
//RMI瀹炶川涓婂氨鏄敓鎴?涓被stub錛宻keleton鏉ヨ繘琛屽弬鏁板拰榪斿洖鍊肩殑浼犻掞紝閲囩敤鍊間紶閫掓柟寮?/font>
//綾諱技浜庝互鍓嶅啓鐨勮亰澶╁紼嬪簭錛岃浼犻掔殑瀵硅薄搴斿疄鐜癹ava.io.Serializable鎺ュ彛
2錛歸ebsphere瀹炵幇
EJB綾諱竴瑙?nbsp;
榪欓噷緇撳悎WebSphere鏉ヨ璁插悇涓被鐨勮皟鐢ㄥ叧緋誨惂銆?
鍋囧畾鎴戜滑瑕佸垱寤轟竴涓鍙朥ser淇℃伅鐨凷essionBean錛岄渶瑕佹垜浠啓鐨勬湁3涓枃浠訛細
1. UserServiceHome.java
Home鎺ュ彛
2. UserService.java
Remote鎺ュ彛
3. UserServiceBean.java
Bean瀹炵幇
WSAD鏈緇堜細鐢熸垚10涓猚lass銆傚叾瀹?涓槸浠涔堝憿錛熸垜浠竴涓竴涓暟榪囨潵錛?
4. _UserServiceHome_Stub.java
榪欎釜褰撶劧灝辨槸Home鎺ュ彛鍦–lient绔?鍔ㄦ佸姞杞?鐨凷tub綾諱簡錛屽畠implements UserServiceHome銆?
5. _EJSRemoteStatelessUserServiceHome_a940aa04_Tie.java
Home鎺ュ彛鍦⊿erver绔殑Skeleton綾伙紝"a940aa04"搴旇鏄殢鏈虹敓鎴愮殑錛屾墍鏈夊叾浠栫殑鐩稿叧class鍚嶉噷閮戒細鏈夎繖涓爣蹇?/p>
涓詫紝Tie鏄疌orba瀵筍keleton鐨勫彨娉曘?
6. EJSRemoteStatelessUserServiceHome_a940aa04.java
Home鎺ュ彛鍦⊿erver绔殑瀹炵幇錛屽綋鐒訛紝瀹冧篃implements UserServiceHome銆?
7. EJSStatelessUserServiceHomeBean_a940aa04.java
鐢?6璋冪敤錛宑reate _UserService_Stub銆?涓轟粈涔?6涓嶈兘鐩存帴create _UserService_Stub鍛紵鍚庨潰鍐嶈銆?
8. _UserService_Stub.java
Remote鎺ュ彛鍦–lient绔?鍔ㄦ佸姞杞?鐨凷tub綾匯傚畠implements UserService銆?
9. _EJSRemoteStatelessUserService_a940aa04_Tie.java
Remote鎺ュ彛鍦⊿erver绔殑Skeleton綾匯?
10. EJSRemoteStatelessUserService_a940aa04.java
Remote鎺ュ彛鍦⊿erver绔殑瀹炵幇錛屽綋鐒訛紝瀹冧篃implements UserService銆傚茍涓旓紝瀹冭礋璐h皟鐢║serServiceBean鈥斺?/p>
涔熷氨鏄垜浠墍鍐欑殑Bean瀹炵幇綾燴斺旈噷闈㈢殑business method銆?
閭d箞錛屽悇涓被涔嬮棿鐨勮皟鐢ㄥ叧緋誨埌搴曟槸鎬庝箞鏍風殑鍛紵綆鍗曠殑璇達紝灝辨槸涓ゆRMI寰幆銆?
絎竴涓猂MI寰幆
鍏堟潵鐪嬬湅Client绔殑紼嬪簭鏄庝箞鍐欑殑錛?
浠g爜:
try {
InitialContext ctx = new InitialContext();
//絎竴姝?
UserServiceHome home =
(UserServiceHome) PortableRemoteObject.narrow(
ctx.lookup(JNDIString),
UserServiceHome.class);
//home: _UserServiceHome_Stub
System.out.println(home.toString());
//絎簩姝?
UserService object = home.create();
//ojbect: _UserService_Stub
System.out.println(object.toString());
//絎笁姝?
int userId = 1;
UserInfo ui = object.getUserInfo(userId);
}
鍦ㄧ涓姝ヤ箣鍚庯紝鎴戜滑寰楀埌浜嗕竴涓猆serServiceHome(interface)瀹氫箟鐨勫璞ome錛岄偅涔堬紝home鍒板簳鏄摢涓猚lass鐨?/p>
instance鍛紵鐢╠ebug鐪嬩竴涓嬶紝鐭ラ亾浜唄ome鍘熸潵灝辨槸_UserServiceHome_Stub鐨勫疄渚嬨?
浠庣浜屾寮濮嬶紝灝辨槸鎴戜滑鐨勫叧娉ㄦ墍鍦紝铏界劧鍙湁綆鍗曠殑涓琛屼唬鐮侊紝
UserService object = home.create();
浣嗘槸浠栬儗鍚庣殑緋葷粺鏄庝箞榪愬仛鐨勫憿錛熸垜浠繘鍏ヤ唬鐮佹潵鐪嬪惂錛?
1. 璋冪敤home.create()
浠g爜:
UserServiceHome home;
UserService obj = home.create();
2. 瀹為檯鏄皟鐢╛UserServiceHome_Stub.create()錛屽湪榪欎釜鏂規(guī)硶閲岄潰錛孲tub鍚慡keleton鍙戦佷簡涓涓猚reate鐨勫瓧涓?/p>
錛?
浠g爜:
org.omg.CORBA.portable.OutputStream out = _request("create", true);
in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out);
3. Server绔殑Skeleton鎺ユ敹Stub鍙戞潵鐨剅equest錛屽茍璋冪敤鐩稿簲鐨勬柟娉曪細
浠g爜:
_EJSRemoteStatelessUserServiceHome_a940aa04_Tie._invoke() {
......
switch (method.length()) {
case 6:
if (method.equals("create")) {
return create(in, reply);
}
......
}
}
浠g爜:
_EJSRemoteStatelessUserServiceHome_a940aa04_Tie.create() {
EJSRemoteStatelessUserServiceHome_a940aa04 target = null;
result = target.create();
org.omg.CORBA.portable.OutputStream out = reply.createReply();
Util.writeRemoteObject(out,result);
return out;
}
4. Skeleton璋冪敤鐨勬槸UserServiceHome鐨凷erver绔疄鐜扮被鐨刢reate鏂規(guī)硶
浠g爜:
EJSRemoteStatelessUserServiceHome_a940aa04.create() {
UserService _EJS_result;
_EJS_result = EJSStatelessUserServiceHomeBean_a940aa04.create();
}
5. #4鍙堣皟鐢‥JSStatelessUserServiceHomeBean_a940aa04.create()
浠g爜:
UserService result = super.createWrapper(new BeanId(this, null));
鑷蟲錛屾垜浠粓浜庣粨鏉熶簡絎竴涓猂MI寰幆錛屽茍寰楀埌浜哛emote鎺ュ彛UserService鐨凷tub綾籣UserService_Stub錛屽氨鏄?5
閲岄潰鐨剅esult銆?
榪欓噷鏈変竴涓棶棰橈紝涓轟粈涔?4涓嶇洿鎺reate _UserService_Stub錛岃屽張杞簡涓閬?5鐨勬墜鍛紵鍥犱負#4 extends from
EJSWrapper錛屽畠娌℃湁鑳藉姏create Stub錛屽洜姝ゅ繀欏誨熷姪#5錛寃hich extends from EJSHome錛岃繖鏍鋒墠鍙互鐢熸垚涓涓?/p>
Stub銆傚鏋滀笉鏄負浜嗙敓鎴愯繖涓猄tub錛屽簲璇ュ彲浠ヤ笉璧?5榪欎竴姝ャ?
絎簩涓猂MI寰幆
OK, now we got the object which is instanceOf _UserService_Stub, and implements UserService
鐜板湪鎴戜滑鐨凜lient绔蛋鍒扮涓夋浜嗭細
UserInfo ui = object.getUserInfo(userId);
緇х畫鐪嬩唬鐮侊紝寮濮嬬浜屼釜RMI寰幆錛?
1. 璋冪敤object.getUserInfo()
浠g爜:
UserService object;
object.getUserInfo(userId);
2. 瀹為檯鏄皟鐢╛UserService_Stub.getUserInfo(int
arg0)錛屽湪榪欎釜鏂規(guī)硶閲岄潰錛孲tub鍚慡keleton鍙戦佷簡涓涓猤etUserInfo鐨勫瓧涓插拰arg0榪欎釜鍙傛暟錛?
浠g爜:
org.omg.CORBA.portable.OutputStream out = _request("getUserInfo", true);
out.write_long(arg0);
in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out);
3. Server绔殑Skeleton鎺ユ敹Stub鍙戞潵鐨剅equest錛屽茍璋冪敤鐩稿簲鐨勬柟娉曪細
浠g爜:
_EJSRemoteStatelessUserService_a940aa04_Tie._invoke() {
switch (method.charAt(5))
{
case 83:
if (method.equals("getUserInfo")) {
return getUserInfo(in, reply);
}
......
}
}
_EJSRemoteStatelessUserService_a940aa04_Tie.getUserInfo() {
EJSRemoteStatelessUserService_a940aa04 target = null;
int arg0 = in.read_long();
UserDTO result = target.getUserInfo(arg0);
org.omg.CORBA_2_3.portable.OutputStream out = reply.createReply();
out.write_value(result,UserDTO.class);
return out;
}
4. Skeleton璋冪敤鐨勬槸UserService鐨凷erver绔疄鐜扮被鐨刧etUserInfo鏂規(guī)硶
浠g爜:
EJSRemoteStatelessUserService_a940aa04.getUserInfo() {
UserServiceBean _EJS_beanRef = container.preInvoke(this, 0, _EJS_s);
_EJS_result = _EJS_beanRef.getUserInfo(id);
}
鏈鍚庣殑鏈鍚庯紝#4緇堜簬璋冪敤浜嗘垜浠啓鐨刄serServiceBean閲岀殑getUserInfo鏂規(guī)硶錛岃繖鎵嶆槸鎴戜滑鐪熸鎯寵鍘誨仛鐨勪簨鎯?/p>
銆?
鑷蟲錛岀浜屼釜RMI寰幆涔熺粓浜庣粨鏉熶簡銆?
璋冪敤嫻佺▼鍥?nbsp;
鍥為【涓涓嬩笂闈㈢殑鍒嗘瀽錛屽彲浠ュ緢娓呮櫚鐨勭湅鍒頒袱嬈MI寰幆鐨勮繃紼嬶紝涓嬪浘(瑙侀摼鎺?鎻忚堪浜嗘暣涓祦紼嬶細
http://www.pbase.com/image/27229257
榛勮壊鐨?錛?錛?0鏄▼搴忓憳瑕佸啓鐨勶紝鍏朵綑鏄郴緇熺敓鎴愮殑銆?
#1鏄疕ome interface, #2鍜?4閮絠mplements 浜嗗畠銆?
#6鏄疪emote interface, #7鍜?9閮絠mplements 浜嗗畠銆?
#10鏄疊ean瀹炵幇銆?
3錛歸eblogic瀹炵幇
涓涓繙紼嬪璞¤嚦灝戣鍖呮嫭4涓猚lass鏂囦歡錛氳繙紼嬪璞★紱榪滅▼瀵硅薄鐨勬帴鍙o紱瀹炵幇榪滅▼鎺ュ彛鐨勫璞$殑stub錛涘璞$殑ske
leton榪?涓猚lass鏂囦歡銆?/p>
鍦‥JB涓垯鑷沖皯瑕佸寘鎷?0涓猚lass錛?/p>
Bean綾伙紝鐗瑰畾App Server鐨凚ean瀹炵幇綾?/p>
Bean鐨剅emote鎺ュ彛錛岀壒瀹欰pp Server鐨剅emote鎺ュ彛瀹炵幇綾伙紝鐗瑰畾App
Server鐨剅emote鎺ュ彛鐨勫疄鐜扮被鐨剆tub綾誨拰skeleton綾?/p>
Bean鐨刪ome鎺ュ彛錛岀壒瀹欰pp Server鐨刪ome鎺ュ彛瀹炵幇綾伙紝鐗瑰畾App
Server鐨刪ome鎺ュ彛鐨勫疄鐜扮被鐨剆tub綾誨拰skeleton綾?/p>
鍜孯MI涓嶅悓鐨勬槸錛孍JB涓繖10涓猚lass鐪熸闇瑕佺敤鎴風紪鍐欑殑鍙湁3涓紝鍒嗗埆鏄疊ean綾誨拰瀹冪殑remote鎺ュ彛錛宧ome鎺ュ彛
錛岃嚦浜庡叾瀹冪殑7涓猚lass鍒板簳鏄庝箞鐢熸垚錛岃鎵撳寘鍦ㄤ粈涔堝湴鏂癸紝鎴栬呮槸鍚﹂渶瑕佹洿澶氱殑綾繪枃浠訛紝浼氭牴鎹笉鍚岀殑App
Server琛ㄧ幇鍑烘瘮杈冨ぇ鐨勫樊寮傦紝涓嶈兘涓姒傝岃銆?/p>
鎷縒eblogic鐨勬潵璇村惂錛學(xué)eblogic鐨凚ean瀹炵幇綾伙紝浠ュ強涓や釜鎺ュ彛鐨刉eblogic鐨勫疄鐜扮被鏄湪ejbc鐨勬椂鍊欒鎵撳寘鍒癊JB
鐨刯ar鍖呴噷闈㈢殑錛岃繖3涓猚lass鏂囦歡鍙互鐪嬪埌銆傝宧ome鎺ュ彛鍜宺emote鎺ュ彛鐨刉eblogic鐨勫疄鐜扮被鐨剆tub綾誨拰skeleton
綾繪槸鍦‥JB琚儴緗插埌Weblogic鐨勬椂鍊欙紝鐢盬eblogic鍔ㄦ佺敓鎴恠tub綾誨拰Skeleton綾葷殑瀛楄妭鐮侊紝鍥犳鐪嬩笉鍒拌繖4涓被
鏂囦歡銆?/p>
瀵逛簬涓嬈″鎴風榪滅▼璋冪敤EJB錛岃緇忚繃涓や釜榪滅▼瀵硅薄鐨勫嬈MI寰幆銆傞鍏堟槸閫氳繃JNDI鏌ユ壘Home鎺ュ彛錛岃幏寰桯ome
鎺ュ彛鐨勫疄鐜扮被錛岃繖涓繃紼嬪叾瀹炵浉褰撳鏉傦紝棣栧厛鏄壘鍒癏ome鎺ュ彛鐨刉eblogic瀹炵幇綾伙紝鐒跺悗鍒涘緩涓涓狧ome鎺ュ彛鐨刉eb
logic瀹炵幇綾葷殑stub綾葷殑瀵硅薄瀹炰緥錛屽皢瀹冨簭鍒楀寲浼犻佺粰瀹㈡埛绔紙娉ㄦ剰stub綾葷殑瀹炰緥鏄湪絎?嬈MI寰幆涓紝鐢辨湇鍔?/p>
鍣ㄥ姩鎬佸彂閫佺粰瀹㈡埛绔殑錛屽洜姝や笉闇瑕佸鎴風淇濆瓨Home鎺ュ彛鐨刉eblogic瀹炵幇綾葷殑stub綾伙級錛屾渶鍚庡鎴風鑾峰緱璇tu
b綾葷殑瀵硅薄瀹炰緥錛堟櫘閫氱殑RMI闇瑕佸湪瀹㈡埛绔繚瀛榮tub綾伙紝鑰孍JB涓嶉渶瑕侊紝鍥犱負鏈嶅姟鍣ㄤ細鎶妔tub綾葷殑瀵硅薄瀹炰緥鍙戦佺粰
瀹㈡埛绔級銆?/p>
瀹㈡埛绔嬁鍒版湇鍔″櫒緇欏畠鐨凥ome鎺ュ彛鐨刉eblogic瀹炵幇綾葷殑stub綾誨璞″疄渚嬩互鍚庯紝璋冪敤stub綾葷殑create鏂規(guī)硶錛?鍦ㄤ唬
鐮佷笂灝辨槸home.create()錛屼絾鏄悗鍙拌鍋氬緢澶氫簨鎯?,浜庢槸緇忚繃絎?嬈MI寰幆錛屽湪鏈嶅姟鍣ㄧ錛孒ome鎺ュ彛鐨刉eblogic
瀹炵幇綾葷殑skeleton綾繪敹鍒皊tub綾葷殑璋冪敤淇℃伅鍚庯紝鐢卞畠鍐嶅幓璋冪敤Home鎺ュ彛鐨刉eblogic瀹炵幇綾葷殑create鏂規(guī)硶銆?/p>
鍦ㄦ湇鍔$錛孒ome鎺ュ彛鐨刉eblogic瀹炵幇綾葷殑create鏂規(guī)硶鍐嶅幓璋冪敤Bean綾葷殑Weblogic瀹炵幇綾葷殑ejbCreate鏂規(guī)硶錛屽湪鏈?/p>
鍔$鍒涘緩鎴栬呭垎閰嶄竴涓狤JB瀹炰緥錛岀劧鍚庡皢榪欎釜EJB瀹炰緥鐨勮繙紼嬫帴鍙g殑Weblogic瀹炵幇綾葷殑stub綾誨璞″疄渚嬪簭鍒楀寲鍙?/p>
閫佺粰瀹㈡埛绔?/p>
瀹㈡埛绔敹鍒皉emote鎺ュ彛鐨刉eblogic瀹炵幇綾葷殑stub綾葷殑瀵硅薄瀹炰緥錛屽璇ュ璞″疄渚嬬殑鏂規(guī)硶璋冪敤錛堝湪瀹㈡埛绔唬鐮佷腑瀹?/p>
闄呬笂灝辨槸瀵箁emote鎺ュ彛鐨勮皟鐢級錛屽皢浼犻佺粰鏈嶅姟鍣ㄧremote鎺ュ彛鐨刉eblogic瀹炵幇綾葷殑skeleton綾誨璞★紝鑰宻kele
ton綾誨璞″啀璋冪敤鐩稿簲鐨剅emote鎺ュ彛鐨刉eblogic瀹炵幇綾伙紝鐒跺悗remote鎺ュ彛鐨刉eblogic瀹炵幇綾誨啀鍘昏皟鐢˙ean綾葷殑We
blogic瀹炵幇綾伙紝濡傛灝卞畬鎴愪竴嬈JB瀵硅薄鐨勮繙紼嬭皟鐢ㄣ?/p>
鐪嬩簡涓閬嶅笘瀛愶紝鎰熻榪樻槸娌℃湁璇村お娓呮錛屾棦鐒跺啓浜嗗笘瀛愶紝灝辨兂褰誨簳鎶婂畠璇存竻妤氥?/p>
鍏堟嬁鏅歊MI鏉ヨ錛屾湁4涓猚lass錛屽垎鍒槸榪滅▼瀵硅薄錛屽璞$殑鎺ュ彛錛屽璞$殑stub綾誨拰skeleton綾匯傝屽璞℃湰韜拰瀵?/p>
璞$殑stub綾誨悓鏃墮兘瀹炵幇浜嗘帴鍙g被銆傝屾垜浠湪瀹㈡埛绔唬鐮佽皟鐢ㄨ繙紼嬪璞$殑鏃跺欙紝铏界劧鍦ㄤ唬鐮佷腑鎿嶇旱鎺ュ彛錛屽疄璐ㄤ笂
鏄湪鎿嶇旱stub綾伙紝渚嬪錛?/p>
鎺ュ彛綾伙細Hello
榪滅▼瀵硅薄錛欻ello_Server
stub綾伙細Hello_Stub
skeleton綾伙細Hello_Skeleton
瀹㈡埛绔唬鐮佽榪欐牱鍐欙細
Hello h = new Hello_Stub();
h.getString();
鎴戜滑涓嶄細榪欐牱鍐欙細
Hello_Stub h = new Hello_Stub();
h.getString();
鍥犱負浣跨敤鎺ュ彛閫傜敤鎬ф洿騫匡紝灝辯畻鏇存崲浜嗘帴鍙e疄鐜扮被錛屼篃涓嶉渶瑕佹洿鏀逛唬鐮併傚洜姝ゅ鎴風闇瑕丠ello.class鍜孒ello_
Stub.class榪欎袱涓枃浠躲備絾鏄浜嶦JB鏉ヨ錛屽氨涓嶉渶瑕丠ello_Stub.class錛屽洜涓烘湇鍔″櫒浼氬彂閫佺粰瀹冿紝浣嗘槸Hello.
class鏂囦歡瀹㈡埛绔槸鐪佷笉浜嗙殑錛屽繀欏繪湁銆傝〃闈笂鎴戜滑鐨勫鎴風浠g爜鍦ㄦ搷綰礖ello錛屼絾鍒繕璁頒簡Hello鍙槸涓涓帴鍙?/p>
錛屾娊璞$殑錛屽疄璐ㄤ笂鏄湪鎿嶇旱Hello_Stub銆?/p>
鎷縒eblogic涓婄殑EJB涓句緥瀛愶紝10涓猚lass鍒嗗埆鏄細
Bean綾伙細HelloBean 錛堢敤鎴風紪鍐欙級
Bean綾葷殑Weblogic瀹炵幇綾伙細HelloBean_Impl 錛圗JBC鐢熸垚錛?br>
Home鎺ュ彛錛欻elloHome 錛堢敤鎴風紪鍐欙級
Home鎺ュ彛鐨刉eblogic瀹炵幇綾?((Hello Bean))_HomeImpl錛圗JBC鐢熸垚錛?br>
Home鎺ュ彛鐨刉eblogic瀹炵幇綾葷殑stub綾?((Hello Bean))_HomeImpl_WLStub錛堥儴緗茬殑鏃跺欏姩鎬佺敓鎴愬瓧鑺傜爜錛?br>
Home鎺ュ彛鐨刉eblogic瀹炵幇綾葷殑skeleton綾?((Hello Bean))_HomeImpl_WLSkeleton錛堥儴緗茬殑鏃跺欏姩鎬佺敓鎴愬瓧鑺傜爜
錛?br>
Remote鎺ュ彛錛?Hello 錛堢敤鎴風紪鍐欙級
Remote鎺ュ彛鐨刉eblogic瀹炵幇綾?((Hello Bean))_EOImpl錛圗JBC鐢熸垚錛?br>
Remote鎺ュ彛鐨刉eblogic瀹炵幇綾葷殑stub綾?((Hello Bean))_EOImpl_WLStub錛堥儴緗茬殑鏃跺欏姩鎬佺敓鎴愬瓧鑺傜爜錛?br>
Remote鎺ュ彛鐨刉eblogic瀹炵幇綾葷殑skeleton綾?((Hello Bean))_EOImpl_WLSkeleton錛堥儴緗茬殑鏃跺欏姩鎬佺敓鎴愬瓧鑺傜爜
錛?/p>
瀹㈡埛绔彧闇瑕丠ello.class鍜孒elloHome.class榪欎袱涓枃浠躲?/p>
((Hello Home)) home = (Home) ((Portable Remote Object)).narrow(ctx.lookup("Hello"), ((Hello
Home)).class);
榪欎竴琛屼唬鐮佹槸浠嶫NDI鑾峰緱Home鎺ュ彛錛屼絾鏄璁頒綇錛佹帴鍙f槸鎶借薄鐨勶紝閭d箞home榪欎釜瀵硅薄鍒板簳鏄粈涔堢被鐨勫璞″疄渚?/p>
鍛紵寰堢畝鍗曪紝鐢╰oString()杈撳嚭鐪嬩竴涓嬪氨鏄庣櫧浜嗭紝涓嬮潰涓琛屾槸杈撳嚭緇撴灉錛?/p>
((Hello Bean))_HomeImpl_WLStub@18c458
榪欒〃鏄巋ome榪欎釜閫氳繃浠庢湇鍔″櫒鐨凧NDI鏍戜笂鏌ユ壘鑾峰緱鐨勫璞″疄闄呬笂鏄疕elloBean_HomeImpl_WLStub綾葷殑涓涓疄渚嬨?/p>
鎺ヤ笅鏉ュ鎴風浠g爜錛?/p>
Hello h = home.create()
鍚屾牱Hello鍙槸涓涓娊璞$殑鎺ュ彛錛岄偅涔坔瀵硅薄鏄粈涔堜笢瑗垮憿錛熸墦鍗頒竴涓嬶細
((Hello Bean))_EOImpl_WLStub@8fa0d1
鍘熸潵鏄疕elloBean_EOImpl_WLStub鐨勪竴涓璞″疄渚嬨?/p>
鐢ㄨ繖涓緥瀛愭潵綆榪頒竴閬岴JB璋冪敤榪囩▼錛?/p>
棣栧厛瀹㈡埛绔疛NDI鏌ヨ錛屾湇鍔$JNDI鏍戜笂Hello榪欎釜鍚嶅瓧瀹為檯涓婄粦瀹氱殑瀵硅薄鏄疕elloBean_HomeImpl_WLStub錛屾墍浠?/p>
鏈嶅姟绔皢鍒涘緩HelloBean_HomeImpl_WLStub鐨勪竴涓璞″疄渚嬶紝搴忓垪鍖栬繑鍥炵粰瀹㈡埛绔?/p>
浜庢槸瀹㈡埛绔緱鍒癶ome瀵硅薄錛岃〃闈笂鏄緱鍒癏elloHome鎺ュ彛鐨勫疄渚嬶紝瀹為檯涓婃槸榪涜浜嗕竴嬈¤繙紼嬭皟鐢ㄥ緱鍒頒簡HelloBea
n_HomeImpl_WLStub綾葷殑瀵硅薄瀹炰緥錛屽埆蹇樿浜咹elloBean_HomeImpl_WLStub涔熷疄鐜頒簡HelloHome鎺ュ彛銆?/p>
鐒跺悗home.create()瀹炶川涓婂氨鏄疕elloBean_HomeImpl_WLStub.create()錛岃鏂規(guī)硶灝嗗彂閫佷俊鎭粰HelloBean_HomeIm
pl_WLSkeleton錛岃孒elloBean_HomeImpl_WLSkeleton鎺ュ彈鍒頒俊鎭悗錛屽啀鍘昏皟鐢℉elloBean_HomeImpl鐨刢reate鏂?/p>
娉曪紝鑷蟲瀹屾垚絎?嬈″畬鏁寸殑RMI寰幆銆?/p>
娉ㄦ剰鍦ㄨ繖嬈MI寰幆榪囩▼涓紝榪滅▼瀵硅薄鏄疕elloBean_HomeImpl錛岃繙紼嬪璞$殑鎺ュ彛鏄疕elloHome錛屽璞$殑stub鏄疕el
loBean_HomeImpl_WLStub錛屽璞$殑skeleton鏄疕elloBean_HomeImpl_WLSkeleton銆?/p>
鐒跺悗HelloBean_HomeImpl鍐嶅幓璋冪敤HelloBean_Impl鐨別jbCreate鏂規(guī)硶錛岃孒elloBean_Impl鐨別jbCreate鏂規(guī)硶灝嗚礋
璐e垱寤烘垨鑰呭垎閰嶄竴涓狟ean瀹炰緥錛屽茍涓斿垱寤轟竴涓狧elloBean_EOImpl_WLStub鐨勫璞″疄渚嬨?/p>
榪欎竴姝ユ瘮杈冩湁瓚g殑鏄紝鍦ㄥ墠涓姝MI寰幆涓紝榪滅▼瀵硅薄HelloBean_HomeImpl鍦ㄥ鎴風鏈変竴涓唬鐞嗙被HelloBean_Ho
meImpl_WLStub錛屼絾鍦ㄨ繖涓姝ワ紝HelloBean_HomeImpl鑷繁鍗村厖褰撲簡HelloBean_Impl鐨勪唬鐞嗙被錛屽彧涓嶈繃HelloBean_
HomeImpl涓嶅湪瀹㈡埛绔紝鑰屾槸鍦ㄦ湇鍔$錛屽洜姝や笉榪涜RMI銆?/p>
鐒跺悗HelloBean_EOImpl_WLStub鐨勫璞″疄渚嬪簭鍒楀寲榪斿洖緇欏鎴風錛岃繖涓姝ヤ篃寰堟湁瓚o紝涓婃RMI榪囩▼錛屼富瑙掓槸Hello
Bean_HomeImpl鍜屽畠鐨勪唬鐞嗙被HelloBean_HomeImpl_WLStub錛屼絾榪欒繖涓嬈℃崲鎴愪簡HelloBean_EOImpl鍜屽畠鐨勪唬鐞嗙被H
elloBean_EOImpl_WLStub鏉ョ帺浜嗐?/p>
Hello h = home.create();h.helloWorld();
鍋囪Hello鎺ュ彛鏈変竴涓猦elloWorld榪滅▼鏂規(guī)硶錛岄偅涔堣〃闈笂鏄湪璋冪敤Hello鎺ュ彛鐨刪elloWorld鏂規(guī)硶錛屽疄闄呬笂鏄湪璋?/p>
鐢℉elloBean_EOImpl_WLStub鐨刪elloWorld鏂規(guī)硶銆?/p>
鐒跺悗HelloBean_EOImpl_WLStub鐨刪elloWorld鏂規(guī)硶灝嗗彂閫佷俊鎭粰鏈嶅姟鍣ㄤ笂鐨凥elloBean_EOImpl_WLSkeleton錛岃孒
elloBean_EOImpl_WLSkeleton鏀跺埌淇℃伅浠ュ悗錛屽啀鍘昏皟鐢℉elloBean_EOImpl鐨刪elloWorld鏂規(guī)硶銆傝嚦姝わ紝瀹屾垚絎?嬈?/p>
瀹屾暣鐨凴MI寰幆榪囩▼銆?/p>
鍦ㄥ垰鎵岺elloBean_EOImpl鏄綔涓鴻繙紼嬪璞¤璋冪敤鐨勶紝瀹冪殑浠g悊綾繪槸HelloBean_EOImpl_WLStub錛屼絾鐜板湪HelloBea
n_EOImpl瑕佷綔涓篐elloBean_Impl鐨勪唬鐞嗙被浜嗐傜幇鍦℉elloBean_EOImpl鍘昏皟鐢℉elloBean_Impl鐨刪elloWorld鏂規(guī)硶
銆傛敞鎰忥紒HelloBean_Impl緇ф壙浜咹elloBean錛岃孒elloBean涓殑helloWorld鏂規(guī)硶鏄垜浠翰鑷紪鍐欑殑浠g爜錛岀幇鍦ㄧ粓
浜庤皟鐢ㄥ埌浜嗘垜浠紪鍐欑殑浠g爜浜嗭紒
鑷蟲錛屼竴嬈JB璋冪敤榪囩▼緇堜簬瀹屾垚銆傚湪鏁翠釜榪囩▼涓紝鏈嶅姟绔富瑕佽璋冪敤鐨勭被鏄疕elloBean_Impl錛?Hello
Bean?_HomeImpl錛孒elloBean_HomeImpl_WLSkeleton錛孒elloBean_EOImpl錛孒elloBean_EOImpl_WLSkeleton銆傚
鎴風涓昏璋冪敤鐨勭被鏄疕elloBean_HomeImpl_WLStub錛孒elloBean_EOImpl_WLStub錛岃繖涓や釜綾誨湪瀹㈡埛绔唬鐮佷腑騫朵笉
浼氱洿鎺ュ嚭鐜幫紝鍑虹幇鍦ㄤ唬鐮佷腑鐨勭被鏄粬浠殑鎺ュ彛HelloHome鍜孒ello錛屽洜姝ゅ鎴風闇瑕佽繖涓や釜鎺ュ彛鏂囦歡錛岃孲tub鏄?/p>
鏈嶅姟鍣ㄤ紶閫佺粰浠栦滑鐨勩?/p>
4 鐞嗚В浣撲細
綆鍗曡錛屽氨鏄負浜嗛傚簲鍒嗗竷寮忓紑鍙戠殑闇瑕併?
棣栧厛錛屽洖鍒版垜鏈鍚庣粰鍑虹殑嫻佺▼鍥俱?
http://www.pbase.com/nobo123/image/27229257
Client绔渶鍘熷鐨勫啿鍔紝鑲畾鏄兘鐩存帴璋冪敤#10.UserServiceBean灝辯埥浜嗐傞偅涔堢涓涓棶棰樻潵浜嗭紝
Client鍜孲erver涓嶅湪涓涓狫VM閲屻?
榪欏ソ鍔烇紝鎴戜滑涓嶆槸鏈塕MI鍚楋紝濂斤紝榪欎釜闂灝辮繖涔堣В鍐充簡錛?
1. UserServiceBeanInterface.getUserInfo()
2. UserServiceBeanStub
3. UserServiceBeanSkeleton
4. UserServiceBean
鐢ㄧ潃鐢ㄧ潃錛岀浜屼釜闂鏉ヤ簡錛?
UserServiceBean鍙湁浜虹敤錛屾病浜虹鐞嗭紝transaction logic, security logic, bean instance pooling logic
榪欎簺涓嶅緱涓嶈冭檻鐨勯棶棰樻誕鍑烘按闈簡銆?
OK錛屾垜浠兂鍒扮敤涓涓猟elegate錛孍JBObject錛屾潵榪涜鎵鏈夎繖浜沴ogic鐨勭鐞嗐俢lient鍜孍JBObject鎵撲氦閬擄紝EJBObj
ect璋冪敤UserServiceBean銆?
娉ㄦ剰錛岃繖涓狤JBObject涔熸槸涓涓狪nterface錛?6.UserService榪欎釜interface姝f槸浠庡畠extends鑰屾潵銆傚茍涓擡JBObje
ct鎵綆$悊鐨勮繖浜沴ogic錛屾鏄疉ppServer鐨勪竴閮ㄥ垎銆?
鐜板湪鐨勬祦紼嬪彉涓轟簡錛?
EJBObject
1. UserService.getUserInfo()
2. UserServiceStub
3. UserServiceSkeleton
4. UserServiceImp
5. UserServiceBean
榪欏凡緇忓拰鏁村箙鍥鵑噷鐨?6, #7, #8, #9, #10涓涓瀵瑰簲浜嗐?
鐜板湪鑳芥弧瓚蟲垜浠殑闇姹備簡鍚楋紵涓嶏紝絎笁涓棶棰樺張鏉ヤ簡錛?
鏃㈢劧鏄垎甯冨紡寮鍙戯紝閭d箞鎴戝綋鐒舵病鐞嗙敱鍙敤涓涓猄pecified Server錛屾垜鍙兘闇瑕佺敤鍒板ソ鍑犱釜涓嶅悓鐨凷erver錛岃?/p>
涓擡JBObject涔熼渶瑕佺鐞嗗憖
OK錛屼負浜嗛傚簲浣犵殑闇瑕侊紝鎴戜滑榪樺緱鍔犲啀涓涓狧omeObject錛岄鍏堝畠鏉ュ喅瀹氱敤鍝釜Server(褰撶劧錛屾槸鐢變綘鐢↗NDI
String璁懼畾鐨?錛屽叾嬈★紝瀹冩潵綆$悊EJBObject銆?
娉ㄦ剰錛岃繖涓狤JBHome涔熸槸涓涓狪nterface錛?1.UserServiceHome榪欎釜interface姝f槸浠庡畠extends鑰屾潵銆傚茍涓擡JBHo
me綆$悊EJBObject鐨刲ogic錛屼篃鏄疉ppServer鐨勪竴閮ㄥ垎銆?
鐜板湪鐨勮皟鐢ㄦ搴忔槸
1. EJBHome.create()
2. EJBHomeStub
3. EJBHomeSkeleton
4. EJBHomeImp(EJSWrapper)
5. EJSHome
寰楀埌EJBObject
6. UserService.getUserInfo()
7. UserServiceStub
8. UserServiceSkeleton
9. UserServiceImp
10. UserServiceBean
鐜板湪宸茬粡瀹屽叏鍜屾祦紼嬪浘鐨勮皟鐢ㄩ『搴忎竴鑷翠簡銆?
//EJB鐨勫熀紜鏄疪MI IIOP,鍘熺悊騫朵笉鏄緢闅撅紝鍏抽敭鏄疄鐜拌搗鏉ユ瘮杈冪粫錛屼竴涓畝鍗曠殑鍔熻兘瑕佺敤10涓紙鎴栨洿澶氾級綾繪潵瀹炵幇錛屼絾姣忎竴涓兘涓嶆槸澶氫綑鐨勩?/strong>
//EJB鐨勮繖縐嶆ā寮忥紙鎴栬RMI錛夊畬鍏ㄥ睆钄戒簡搴曞眰鐨勭綉緇滐紝騫跺緢濂界殑瀹炵幇浜嗗涓氬姟浠g爜鐨勪繚鎶ゃ?/strong>