<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    走在架構師的大道上 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 閱讀(7256) 評論(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
    淺薄之談,文章具有誤導性。閱讀者請自行分辨。  回復  更多評論
      

    主站蜘蛛池模板: 国产精品免费看香蕉| 免费鲁丝片一级在线观看| 国产av无码专区亚洲av果冻传媒| 亚洲国产欧美国产综合一区| 成年大片免费视频| 色偷偷噜噜噜亚洲男人| 国产大片91精品免费看3| 羞羞漫画登录页面免费| 亚洲国产成人乱码精品女人久久久不卡 | 亚洲av最新在线观看网址| 免费观看理论片毛片| 国产区图片区小说区亚洲区| 亚洲日本在线免费观看| 18女人腿打开无遮掩免费| 亚洲国产视频网站| 四虎影视www四虎免费| 四虎成人精品国产永久免费无码| 亚洲av高清在线观看一区二区 | 亚洲男人都懂得羞羞网站| 最近中文字幕电影大全免费版| 亚洲最新黄色网址| 免费毛片在线播放| 国产成人精品免费大全| 久久久久久亚洲精品| 97国产免费全部免费观看| 在线91精品亚洲网站精品成人| av在线亚洲欧洲日产一区二区| 亚洲第一综合天堂另类专| 亚洲国产成人久久一区WWW| 久久狠狠躁免费观看| 亚洲av产在线精品亚洲第一站| 免费在线观看的黄色网址| 久久这里只精品99re免费| xxx毛茸茸的亚洲| 伊人久久亚洲综合| 免费精品国产自产拍在| 国产精品成人啪精品视频免费| 亚洲精品国产肉丝袜久久| 国产又黄又爽又刺激的免费网址| a级毛片免费高清毛片视频| 国产精品亚洲一区二区麻豆|