ICE简单介绍及使用示例

请重点参考原文见:ICE简单介绍及使用示例 http://blog.csdn.net/fenglibing/article/details/6372444

以下内容为个人实战笔记,(额。。。好像本博大多数都是实战笔记。。以至于有很多博文只是用来记笔记用的,遗留的很多问题自己都没有解决。。。。。。)

简单来说,通过ICE,可以实现跨服务器,跨语言通信。那么ICE最重要的就是定义通信协议。

协议的格式很简单,例如,定义一个ICE文件Jacoxu.ice,内容如下:

  1. #include <Jacoxu_datalayer_common_data_stru.ice>   
  2. module JacoxuDataSync   
  3. {   
  4.    struct WriteContent   
  5.    {     
  6.        JacoxuDataLayerCommon::SPSData   seqSPDataQ;   
  7.    };       
  8.     interface JacoxuDataSyncInterface   
  9.     {   
  10.      idempotent int RequestResource(int nID, int nType, out string  strErrMsg);                
  11.          idempotent int BatchWrite(int nBatchRows, WriteContent struWriteContent, out string  strErrMsg);         
  12.     };                                       
  13. };  

定义好接口之后,利用ICE工具进行转化,可以把接口翻译成各种计算机语言进行使用,例如:
slice2java Jacoxu.ice
或者:
slice2java –impl Jacoxu.ice (注意前面是两个横杠,impl的意思是生成一个示例模版)

则可以生成多个java文件。

这时候要实现ICE接口的内容,分别充当Server和Client。

Server要实现的是类似 _JacoxuDataSyncInterfaceDisp.java (_<interface-name>Disp.java  )这样的一个抽象里:

可以自己创建一个类,然后:

  1. import Ice.Current;   
  2. import Ice.StringHolder;   
  3.   
  4. public class JacoxuServer_InterfaceI extends _JacoxuDataSyncInterfaceDisp{   
  5.   
  6. }   

此时IDE会提示你去实现抽象类中尚未实现的接口函数(注意使用的过程中,需要引用ICE提供的Ice.jar包),如本例中的:

int RequestResource(int nID, int nType, out string strErrMsg);
int BatchWrite(int nBatchRows, WriteContent struWriteContent, out string strErrMsg);

具体可以看 ICE简单介绍及使用示例 原文

同时,Server端还应该把服务启动,简单的启动方式如下:

  1. public class JacoxuServer {   
  2.   
  3.     private static String indexVersion = “+++[current version: 2015-02-12]+++”;   
  4.     public static void main(String[] args){   
  5.         //load config   
  6.         try {   
  7.             Config.loadConfig();   
  8.         } catch (Exception e1) {   
  9.             e1.printStackTrace();   
  10.             try {   
  11.                 Config.log.info(“JacoxuDataSynServer has error, sleep 30 seconds!”);   
  12.                 Thread.sleep(30000);   
  13.             } catch (InterruptedException e) {   
  14.                 e.printStackTrace();   
  15.             }   
  16.         }   
  17.   
  18.         int status = 0;   
  19.         Ice.Communicator ic = null;   
  20.         try {   
  21.             //print the version information   
  22.             Config.log.info(indexVersion);   
  23.             //ice initialization   
  24.             Config.log.info(“start ICE initialize”);   
  25.             Ice.StringSeqHolder argsH = new Ice.StringSeqHolder(args);   
  26.             Ice.Properties properties = Ice.Util.createProperties(argsH);   
  27.             properties.setProperty(“Ice.MessageSizeMax”“12288″);   
  28.             properties.setProperty(“Ice.ThreadPool.Server.Size”“10″);   
  29.             properties.setProperty(“Ice.Override.Timeout”“180000″);   
  30.             properties.setProperty(“Ice.Override.ConnectTimeout”“180000″);   
  31.             Ice.InitializationData iData = new Ice.InitializationData();   
  32.             iData.properties = properties;   
  33.             ic = Ice.Util.initialize(iData);   
  34.             Config.log.info(“start get SysConfig Properties”);   
  35.             //step 1. get a ice configure   
  36.             Config.log.info(“get ICE Servant”);   
  37.   
  38.             Config.log.info( “ICE: ”+ Config.iceServiceName +“ ”+ Config.iceServicePort );   
  39.                
  40.             String portString = “default -p ” + Config.iceServicePort;   
  41.             Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(Config.iceServiceName, portString);    
  42.                
  43.             Ice.Object object_q = new JaocxuServer_InterfaceI();   
  44.             adapter.add(object_q, Ice.Util.stringToIdentity(Config.iceServiceName));   
  45.                
  46.             Config.log.info(“start Activate Adapter”);   
  47.             adapter.activate();    
  48.             Config.log.info(“adapter.activate()”);   
  49.   
  50.             Config.log.info(“begin ice server…”);   
  51.   
  52.             ic.waitForShutdown();   
  53.             Config.log.info(“ic.waitForShutdown()”);   
  54.                
  55.         } catch (Ice.LocalException e) {   
  56.             e.printStackTrace();   
  57.             status = 1;   
  58.         } catch (Exception e) {   
  59.             Config.log.error(e.getMessage());   
  60.             status = 1;   
  61.         } finally {   
  62.             Config.log.info(“end ice server…”);   
  63.             if (ic != null)   
  64.                 ic.destroy();   
  65.             try {   
  66.                 Thread.sleep(180000);   
  67.             } catch (InterruptedException e) {   
  68.                 // TODO Auto-generated catch block   
  69.                 e.printStackTrace();   
  70.             }   
  71.         }   
  72.         System.exit(status);   
  73.     }   
  74. }   

程序中使用了default  表示默认的即为本地地址,如果需要建立远程地址则需要使用:tcp -h  ICE.Ip

而Client端则是发起 请求,稍微简单一点。

主要是去调用<interface-name>Prx.java 这样的代理接口,例如本例中的 JacoxuDataSyncInterfacePrx.java类。

  1. String proxyStr = aICE.ServantName+“:tcp -h ”+aICE.Ip+“ -p ” + aICE.Port;   
  2. //传入远程服务单元的名称、网络协议、IP及端口,获取Printer的远程代理,这里使用的stringToProxy方式     
  3. Ice.ObjectPrx tmpJacoxuDataSyncServer = ic.stringToProxy(proxyStr);   
  4. //通过checkedCast向下转换,获取JacoxuDataSyncInterface接口的远程,   
  5. //并同时检测根据传入的名称获取的服务单元是否JacoxuDataSyncInterface的代理接口,如果不是则返回null对象     
  6. JacoxuDataSync.JacoxuDataSyncInterfacePrx jacoxuDataSync    
  7.     = JacoxuDataSync.JacoxuDataSyncInterfacePrxHelper.checkedCast(tmpJacoxuDataSyncServer);   
  8. if (jacoxuDataSync == nullthrow new Error(“Invalid proxy”);   
  9. jacoxuDataSync.method(); //调用接口了  

——–记 2015/02/13 03:24 am.

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>