隨筆-124  評(píng)論-194  文章-0  trackbacks-0

          spring包裝了rmi后,使我們得到幾點(diǎn)便利:

          不用調(diào)用rmic編譯stub和skeleton

          不用直接實(shí)現(xiàn)remote接口

          不需要啟動(dòng)命名服務(wù)rmiregistry

          但,卻不支持原來(lái)rmi的回調(diào)功能。查閱許多網(wǎng)頁(yè)也不得其解。

           

          今天,想到一招,共享出來(lái),如果大家有好辦法歡迎回貼共享。

           

          正常做法是:

          回調(diào)一般是用在一群client端需要server來(lái)通知的情況,一般server就用Vector來(lái)保存client對(duì)象。

          server端需要提供一個(gè)方法,client把對(duì)象傳過(guò)來(lái)后,保存到Vector中,以后就可以通知client們了:

          register (ClientObject obj);

           

          在spring里,基本做法是一樣的,唯一不同是,在這個(gè)方法里,client不能傳對(duì)象,我們就傳一個(gè)client提供出來(lái)的rmi對(duì)象的url:

          register(String url);

           

          在client端,就如正常使用先獲得server對(duì)象,再調(diào)用這個(gè)方法,注意組成url的代碼:

           

                  NodeService service = (NodeService) factory.getAPIObject("nodeServiceProxy");
                  String name 
          = null;
                  
          try {
                      name 
          = "rmi://" + InetAddress.getLocalHost().getHostName() + "/NodeNotifyService";
                  }
           catch (Exception ue) {}
                  
          int result = service.registerFlower (name);
                  logger.info (
          "result="+result);

           

          在server端registerFlower處理里,根據(jù)url動(dòng)態(tài)創(chuàng)建這個(gè)對(duì)象,代碼如下:

           

          public class NodeServiceImpl implements NodeService {
              
          public static final Logger logger = LoggerFactory.getLogger(NodeServiceImpl.class);
              
              
          public NodeNotifyService service = null
              
              
          public int registerFlower (String url) {
                  logger.info (url);
                  
                  RmiProxyFactoryBean rmiProxyFactoryBean 
          = new RmiProxyFactoryBean(); 
                  rmiProxyFactoryBean.setServiceInterface(NodeNotifyService.
          class); 
                  
                  logger.info (
          "begin set url");
                  rmiProxyFactoryBean.setServiceUrl(url);
                  
                  
          try 
                      logger.info (
          "begin set");
                      rmiProxyFactoryBean.afterPropertiesSet(); 
                  }
           catch (Exception ex) 
                      logger.info (
          "exception");
                  }
           

                  
          if (rmiProxyFactoryBean.getObject() instanceof NodeNotifyService) 
                      service 
          = (NodeNotifyService) rmiProxyFactoryBean.getObject(); 
                  }


                  
          return 0;
              }

          }



          這樣就從url轉(zhuǎn)換成client對(duì)象了,當(dāng)然了,還是需要在client和server各自配置文件里配置RmiServiceExporter,這一步很簡(jiǎn)單,和正常的spring的rmi是一樣的了。

          做到這步后,我還想把所有接口文件放到一個(gè)JAR里,client和server的實(shí)現(xiàn),以及各自邏輯放到各自的JAR中,這樣各自改實(shí)現(xiàn)就不需要兩邊更新包。改接口的話,就更新接口所在JAR。不知道這樣安排是否合理?
          posted on 2007-06-21 15:46 我愛(ài)佳娃 閱讀(3293) 評(píng)論(4)  編輯  收藏 所屬分類: Spring

          評(píng)論:
          # re: 在spring中實(shí)現(xiàn)rmi回調(diào)(callback)功能 2009-03-31 08:58 | meng
          能否給出完整的事例!謝謝!!  回復(fù)  更多評(píng)論
            
          # re: 在spring中實(shí)現(xiàn)rmi回調(diào)(callback)功能 2009-03-31 10:58 | meng
          趕快呀  回復(fù)  更多評(píng)論
            
          # re: 在spring中實(shí)現(xiàn)rmi回調(diào)(callback)功能[未登錄](méi) 2012-07-23 16:34 | Python
          完整的例子有沒(méi)啊。。。。  回復(fù)  更多評(píng)論
            
          # re: 在spring中實(shí)現(xiàn)rmi回調(diào)(callback)功能 2016-06-13 15:14 | wwar
          這算個(gè)毛線回調(diào)  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 马关县| 重庆市| 玛多县| 阜平县| 长乐市| 阜阳市| 甘谷县| 容城县| 西乌| 桂阳县| 恭城| 阿拉善右旗| 武定县| 保德县| 连江县| 磐石市| 福鼎市| 章丘市| 嵊州市| 鄂尔多斯市| 绥化市| 唐山市| 夏河县| 双峰县| 长垣县| 安陆市| 威海市| 文安县| 赫章县| 许昌市| 岫岩| 莒南县| 宣威市| 邯郸县| 大新县| 苗栗市| 崇明县| 高密市| 泌阳县| 襄樊市| 光山县|