RPC之ICE java簡單使用

來源:互聯網
上載者:User

之前使用rpc都是webservice、hessian、dubbo之類,現在公司裡使用ICE,以前都沒有怎麼聽過的,自己花一些時間學習下ice,並寫一個demo,java裡基礎的資料類型傳輸都沒太大問題,對象的傳輸卻麻煩一些,自己在查了很多資料才實現,網上很少找到一個傳輸物件類型的完整執行個體。費話不多說,現在貼代碼。

       slice檔案,hello.ice:

module com{      module test{          // 預定義          module bean{              class Response;          };          module bean{              class Request;          };          module operator{                        // 執行者              interface Hello{                  // 擷取Response對象                  idempotent com::test::bean::Response sayHello(com::test::bean::Request request);              };          };      };  }; 

      RequestDef.ice檔案:

 module com{      module test{          module bean{                            class Request{                                // Fields                 string traceid;                  string message;                                    // Methods                  string gettraceid();                  void settraceid(string traceid);                                    string getmessage();                  void setmessage(string message);                                };                    };      };  };

ResponseDef.ice檔案:

 

 module com{      module test{          module bean{                            class Response{                                // Fields                  string code;                  string message;                                    // Methods                  string getcode();                  void setcode(string code);                                    string getmessage();                  void setmessage(string message);                                };                    };      };  };

HelloI.java

package com.test.impl;import java.io.Serializable;import Ice.Current;import com.test.bean.Request;import com.test.bean.Response;import com.test.operator._HelloDisp;import com.test.response.ResponseI;public class HelloI extends _HelloDisp implements Serializable {private static final long serialVersionUID = 1L;@Overridepublic Response sayHello(Request request, Current __current) {Response response=new ResponseI();        response.setcode("x001");response.setmessage("test response");return response;} }

HelloServer.java:

package com.test.server;import java.io.Serializable;import Ice.ObjectAdapter;import com.test.bean.Request;import com.test.impl.HelloI;import com.test.request.ObjectFactory4Request;public class HelloServer implements Serializable {private static final long serialVersionUID = -691557224337330222L;public static void main(String[] args) {//執行狀態int status = 0;Ice.Communicator ic = null;try {// 初始化環境ic = Ice.Util.initialize();// 添加自訂工廠類,用於請求資訊的組裝,如果請求參數不是參考型別的話,就不需要了ic.addObjectFactory(new ObjectFactory4Request(), Request.ice_staticId());//初始化AdapterString name = "HelloServer";String endpoints = "default -h 127.0.0.1 -p 9999";ObjectAdapter objAdapter = ic.createObjectAdapterWithEndpoints(name, endpoints);//建立伺服者Ice.Object servant = new HelloI();//添加伺服者至適配器objAdapter.add(servant,Ice.Util.stringToIdentity("HelloId"));//啟用objAdapter.activate();System.out.println("HelloId 服務啟動,等待接收資訊....");//等待關閉ic.waitForShutdown();} catch (Exception e) {e.printStackTrace();status = 1;} finally {if (ic != null) {ic.destroy();}System.exit(status);}}}

HelloClient.java

/** *  */package com.test.client;import java.io.Serializable;import com.test.bean.Request;import com.test.bean.Response;import com.test.operator.HelloPrx;import com.test.operator.HelloPrxHelper;import com.test.request.RequestI;import com.test.response.ObjectFactory4Response;import Ice.ObjectPrx;public class HelloClient implements Serializable{private static final long serialVersionUID = 1L;    private Ice.Communicator ic = null;     public static void main(String[] args) {          HelloClient client = new HelloClient();     Request request=new RequestI();    request.settraceid("002");    request.setmessage("test");        Response response = client.sayHello(request);                  StringBuffer info = new StringBuffer();         if (response == null) {             info.append("無返回資訊");         } else {             info.append("code=" + response.code);             info.append(",message=" + response.getmessage());         }         System.out.println(info.toString());         //退出jvm        System.exit(0);     }    /**     */     public Response sayHello(Request request){     Response response = null;         try {             // 擷取代理             HelloPrx helloPrx=null;            if (this.ic == null) {                 //初始化環境                 ic = Ice.Util.initialize();             }             // 建立代理基類對象             String str = "HelloId:default -h 127.0.0.1 -p 9999";                          ObjectPrx objPrx = this.ic.stringToProxy(str);             helloPrx = HelloPrxHelper.checkedCast(objPrx);              // 添加自訂類            Ice.ObjectFactory factory = new ObjectFactory4Response();            //增加工廠類,用於返回資訊的組裝,如果返回參數不是參考型別的話,就不需要了            this.ic.addObjectFactory(factory, com.test.response.ResponseI.ice_staticId());            response = helloPrx.sayHello(request);         } catch (Exception e) {             e.printStackTrace();         }         return response;     } }

ObjectFactory4Request.java這個很重要

/** *  */package com.test.request;import Ice.ObjectFactory;public class ObjectFactory4Request implements ObjectFactory {       @Override     public Ice.Object create(String type) {         if (type.equals(com.test.request.RequestI.ice_staticId())) {             return new RequestI();         }         return null;     }      @Override     public void destroy() {         // TODO Auto-generated method stub     } }
RequestI.java

/** *  */package com.test.request;import java.io.Serializable;import Ice.Current;import com.test.bean.Request;public class RequestI extends Request implements Serializable{/** *  */private static final long serialVersionUID = -4990773688048548492L;@Overridepublic String gettraceid(Current __current) {return this.traceid;}@Overridepublic void settraceid(String traceid, Current __current) {this.traceid=traceid;}@Overridepublic String getmessage(Current __current) {return this.message;}@Overridepublic void setmessage(String message, Current __current) {this.message=message;}}
ObjectFactory4Response.java 這個也重要

/** *  */package com.test.response;import Ice.ObjectFactory;public class ObjectFactory4Response implements ObjectFactory {       @Override     public Ice.Object create(String type) {         if (type.equals(com.test.response.ResponseI.ice_staticId())) {             return new ResponseI();         }         return null;     }      @Override     public void destroy() {         // TODO Auto-generated method stub      } }
ResponseI.java

/** *  */package com.test.response;import java.io.Serializable;import Ice.Current;import com.test.bean.Response;public class ResponseI extends Response implements Serializable{/** *  */private static final long serialVersionUID = 1L;@Overridepublic String getcode(Current __current) {return this.code;}@Overridepublic void setcode(String code, Current __current) {this.code=code;}@Overridepublic String getmessage(Current __current) {return this.message;}@Overridepublic void setmessage(String message, Current __current) {this.message=message;}}
其他的slice產生的java就不貼出來了,先啟動HelloServer服務,然後啟動用戶端HelloClient,就可以測試了。

源碼下載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.