之前使用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,就可以測試了。
源碼下載