走在架構師的大道上 Jack.Wang's home

          Java, C++, linux c, C#.net 技術,軟件架構,領域建模,IT 項目管理 Dict.CN 在線詞典, 英語學習, 在線翻譯

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks

          ??????? 四年前也是 Java? 的 fans,也曾如火如荼的追求著 sun,追求著 java. 當然 RMI 肯定不會放過,但到目前為止還沒有在任何一個項目中用過,昨天聽了一個 java 老師的課,本來不去想聽,可想想我交了這么多 money,最后還是去。最叫人惡心的是他講的 RMI 一點實用價值都沒有,而且有的理論也不對。真的誤導人啊,學術理論和實踐是不能夠分離的,老師是這樣的,只能靠學生自己動手豐衣足食了。昨天晚上用了一點時間,從新研究了一下 RMI。舉個例子作為 RMI 學習的終結吧。
          ??????? 在寫這篇文章前也訪問了中國電信的高級工程師,根據他的介紹,RMI 有很多實現方式,而且現在他發現 RMI 在大規模分布式系統中,效率和性能不是很好。目前他帶領的團隊正在自行開發分布式應用。
          ????????隨著 web 2.0 時代的到來,SOA 開發思想的普及應用。分布式應用,將又一次走向高潮。
          ??????? RMI? 開發步驟大家都很清楚,這里舉個不用手動啟動 rmiRegistry, 也不要指定 codebase 和web server 的例子.底層 TCP/IP 細節我們不用去管他,你就把他看成像 SOAP、JNDI 等一樣的基于注冊服務的東西就行了 .

          1. 遠程接口
          import java.rmi.Remote;
          import java.rmi.RemoteException;

          public interface IRMI extends Remote {
          ?public Object invoke(ITask task) throws RemoteException;
          }
          2.遠程接口實現

          /**
          ?* @author Jack.Wang
          ?*
          ?*/
          import java.rmi.RemoteException;
          import java.rmi.server.UnicastRemoteObject;

          public class IRMIImpl extends UnicastRemoteObject implements IRMI {

          ?protected IRMIImpl() throws RemoteException {
          ??super();
          ?}

          ?public Object invoke(ITask task) throws RemoteException {
          ??System.out.println("注意:這是一個遠程調用");
          ??Object obj = task.doWork();
          ??System.out.println("調用ITask.doWork()方法的返回值:" + obj.toString());
          ??// 客戶端調用,可以在服務器端播放需要的音樂
          ??ProcessCaller.callMp3();
          ??return obj;
          ?}
          }
          3.? 任務接口
          /**
          ?* @author Jack.Wang
          ?*
          ?*/
          import java.io.Serializable;
          public interface ITask extends Serializable {
          ?public Object doWork();
          }
          4.? 任務實現類
          /**
          ?* @author Jack.Wang
          ?*
          ?*/

          public class TaskImpl implements ITask {

          ?public Object doWork() {
          ??System.out.println("當前程序處于遠程調用中");
          ??return Thread.currentThread().getName() + " "
          ????+ new Date(System.currentTimeMillis());
          ?}
          }
          5.在java中調用windows程序
          public class ProcessCaller {
          ?
          ?public static void callMp3() {
          ??Runtime ru = Runtime.getRuntime();
          ??try {
          ???// 調用播放器文件播放指定MP3
          ???Process p1 = ru
          ?????.exec("C:\\Program Files\\Windows Media Player\\wmplayer D:\\Jack\\Mp3\\5.秋天不回來-王強.mp3");
          ??} catch (Exception e) {

          ??}
          ?}
          }
          6. Server 端代碼
          /**
          ?* @author Jack.Wang
          ?*
          ?*/
          import java.rmi.Naming;
          import java.rmi.registry.LocateRegistry;
          import java.rmi.registry.Registry;

          public class RMIServer {

          ?public static void registRemoteObject() throws Exception {
          ??IRMIImpl impl = new IRMIImpl();
          ??Naming.rebind("rmi://210.43.109.25:1111/mytask", impl);
          ??System.out.println("bound success!");
          ?}

          ?private static Registry createRegistry() {
          ??Registry registry = null;
          ??int port = 1111;
          ??try {
          ???registry = LocateRegistry.getRegistry("210.43.109.25", port);
          ???registry.list();
          ???System.out.println("Register the exist server!");
          ??} catch (final Exception e) {
          ???try {
          ????registry = LocateRegistry.createRegistry(port);
          ????System.out.println("Register the exist server!port=" + port);
          ???} catch (final Exception ee) {
          ????ee.printStackTrace();
          ???}
          ??}
          ??return registry;
          ?}

          ?/**
          ? * 將對象注冊到rmi服務器上
          ? */
          ?public static void bind() {
          ??Registry registry = null;
          ??registry = createRegistry();
          ??try {
          ???IRMIImpl impl = new IRMIImpl();
          ???registry.rebind("mytask", impl);
          ???System.out.println("mytask server start!");
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??}
          ?}

          ?/**
          ? * @param args
          ? */
          ?public static void main(String[] args) {
          ??try {
          ???bind();
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??}
          ?}

          }
          7. Client 端代碼

          /**
          ?* @author Jack.Wang
          ?*
          ?*/?
          public class RMIClient {
          ?public static void getRemoteObject() throws Exception {
          ??IRMI obj = (IRMI) Naming.lookup("rmi://210.43.109.28:1111/mytask"); // 得到遠程發布的服務
          ??TaskImpl task = new TaskImpl();
          ??Object result = obj.invoke(task); // 調用遠程服務的方法
          ??System.out.println(result.toString());
          ?}

          ?public static void main(String[] args) {
          ??try {
          ???getRemoteObject();
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??}
          ?}
          }

          小結:
          ??????? 建議把以上程序打包成 jar 文件,你可以在不同機子間測試。
          ??????? RMI 就這么簡單,如果你覺得他不爽,就自己封裝 socket. 到時候要通知我哦,我也學習學習。





          本博客為學習交流用,凡未注明引用的均為本人作品,轉載請注明出處,如有版權問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學習進步。
          posted on 2007-11-22 10:49 Jack.Wang 閱讀(7261) 評論(13)  編輯  收藏 所屬分類: 開發技術

          Feedback

          # re: 終結 RMI, 學術界引起的思考 2007-11-22 11:20 loocky
          你的標題有點嚇人,文中說RMI的性能不好??  回復  更多評論
            

          # re: 終結 RMI, 學術界引起的思考 2007-11-22 13:37 JBahamut
          server把遠程對象的stub傳到client端就可以用了,registry完全可以不需要,bind之類的也可以不用  回復  更多評論
            

          # re: 終結 RMI, 學術界引起的思考 2007-11-22 13:49 loocky
          registy方式是naming service 方式吧?  回復  更多評論
            

          # re: 終結 RMI, 學術界引起的思考 2007-11-22 18:25 lizongbo
          標題夠唬人,
          RMI性能不好? 和電信打交道沒看見過什么厲害點的人.
          不用codebase 是因為你都打包在一起了.
          但是你有試過服務器為雙網卡的情況嗎?
          rmi可設置的參數還是不少的.
            回復  更多評論
            

          # re: RMI 小結 2007-11-30 09:07 良少
          RMI是非常好的Java RPC技術, 我在我的項目中大量使用RMI。 RMI性能優良,實現簡單,不要太好啊! 我看,該廢掉的是EJB!  回復  更多評論
            

          # re: RMI 小結 2007-12-01 22:09 未來之我制作
          對于 RMI還只是限于了解啊 有點內疚啊

          不過 我會 努力的
            回復  更多評論
            

          # re: RMI 小結 2007-12-05 14:53 c
          終結 RMI, 學術界引起的思考 .....
          這個標題有點問題啊……  回復  更多評論
            

          # re: RMI 小結 2007-12-05 17:05 王偉
          同意,我也建議廢掉EJB,不過EJB6.0不知道怎么樣,如果好的話,用用也無妨,畢竟沒有十全十美的東西。  回復  更多評論
            

          # re: RMI 小結 2007-12-09 09:11 nk912114
          呵呵,ice應該說比起rmi來說,還是有很大優勢的  回復  更多評論
            

          # re: RMI 小結 2008-07-10 20:32 foolnix
          EJB6.0?  回復  更多評論
            

          # re: RMI 小結 2008-09-18 13:38 antisaas
          云,EJB 8.0正式發布,據說EJB2009年底面世,而且EJB2010也計劃明年中發布...  回復  更多評論
            

          # re: RMI 小結 2009-06-12 09:21 路見不平
          樓主大言不慚,佩服!
          曾有鄭州某學院的大一新生跑到清華大學四教,看一計算機系研究生在寫C++代碼,邊上放著一本中譯本的《C++ primer》,便大叫道:“你是學計算機的嗎,為什么要看中文書?我從來都不看的,沒什么參考價值!C++這東西是要靠實踐去領悟的,看書特別是中文書簡直是浪費時間。”研究生大喜,忙請他幫助解決問題,令人非常失望的是,那位小朋友競然連指針都搞不明白。
          我忍不住笑了,覺得很難堪的他看著我很鄙視地說道:“你懂C++嗎?”我忙說不懂。可是他不知道,我馬上就畢業了,c++是在三年前學的,而且一直在用。
          所以我猜樓主是不是跟那個人有關系,或者說是同一個人?  回復  更多評論
            

          # re: RMI 小結 2013-05-22 16:10 check
          淺薄之談,文章具有誤導性。閱讀者請自行分辨。  回復  更多評論
            

          主站蜘蛛池模板: 恩平市| 盐亭县| 呈贡县| 高唐县| 合肥市| 南开区| 耒阳市| 邯郸市| 缙云县| 灵宝市| 白玉县| 贡嘎县| 河东区| 青岛市| 翁源县| 利川市| 崇左市| 固镇县| 东海县| 灯塔市| 临西县| 清原| 舟曲县| 钟山县| 株洲市| 南宫市| 都兰县| 竹山县| 克拉玛依市| 饶阳县| 镇康县| 宁波市| 平江县| 关岭| 大石桥市| 汉寿县| 蕲春县| 合江县| 色达县| 遂溪县| 双牌县|