ICE应用实例(01):

标签: ice 应用 实例 | 发表时间:2015-04-24 12:36 | 作者:zihai367
出处:http://www.iteye.com

本文接上篇博文《ICE通信框架》如果你还没有接触过ice请先阅读我的上篇博文 http://blog.csdn.net/liuzhoulong/archive/2011/03/04/6223450.aspx

 

本文将结合实际项目,做一个基于 ice的实际项目实例应用,该实例完成客户端调用服务端接口完成消息发送,计算的功能。

1,创建java项目ICEServer,导入ice.jar.

2,在项目下创建slice文件夹,编写model.ice,service.ice,service2.ice文件,其内容如下

model.ice

#ifndef _MODEL
#define _MODEL
module com
{
   module alan
   {
     module generated
     {
         module model
         {
                 /**定义整型数组**/
                    sequence<int> IntegerArray;
                    /**自定义Map类型**/
                    dictionary<string, string> CustomMap;
                    /**消息类型**/
                    enum MessageType {ERROR,INFO,WARNING};
                    /**计算操作类型**/
                    enum CalcType {Adds,Subtract,Multiply,Divide};
     
                      /**消息的操作类型**/
                    enum ActionType {Add,Remove,Stop,Start,Pause};
                 
                    /** 消息结构 **/
                    ["java:getset"]
                    struct Message {
                         /**消息类型**/
                         MessageType type;
                         /**消息类型**/
                         ActionType action;
                         /**相关id**/
                         IntegerArray relatedIds;
                         /**扩展属性**/
                         CustomMap extention;
                    };
            };
        };
 };
};
#endif

 

 

service.ice

#ifndef _GENERATED
#define _GENERATED
#include <model.ice>
module com
{
   module alan
   {
       module generated
       {
         interface MessageServiceIce
         {
             /**
              *  向ice服务发送信息
              *  @param message 消息内容
              *  @return true 成功  false 失败
              */
                string sendMessage(model::Message msg);
             };
   };
   };
};
#endif

  

 

service2.ice

#ifndef _GENERATED
#define _GENERATED
#include <model.ice>
module com
{
   module alan
   {
       module generated
       {
         interface CalcServiceIce
         {
             /**
              *  服务端计算方法
              *  @param d1 计算数1
     *  @param d2 计算数2
     *  @param type 计算方式
              *  @return true 成功  false 失败
              */
                double calc(double d1, double d2, model::CalcType cal);
             };
   };
   };
};
#endif

  

 

 3.dos环境下执行

          cd E:/workspace/ICEService/slice

          E:/Ice-3.3.0/bin/slice2java -I. --output-dir=../src *.ice //生产代码

          E:/Ice-3.3.0/bin/slice2html -I. --output-dir=doc *.ice//生产doc文档,可以忽略

   将生产generated包下代码以jar包方式导出icetest.jar,并在项目中建立lib目录放入其中(把ice.jar也放入lib下,以备后用),可以删除其生产代码,以jar方式调用其代码。

 4,编写发布接口实现代码和服务器端代码

CalcServiceIceImpl .java实现数学计算:

package com.alan.generated.servant;

import Ice.Current;

import com.alan.generated._CalcServiceIceDisp;
import com.alan.generated.model.CalcType;

/** 
 * @author zcq
 * @version 创建时间:2015-4-23 下午06:25:17 
 * 实现数学计算 
 */
public class CalcServiceIceImpl extends _CalcServiceIceDisp{

	public double calc(double num1, double num2, CalcType type, Current arg3) {
        double re = 0.0d;
		switch (type) {
		  case Adds:
		   re = num1 + num2;
		   break;
		  case Subtract:
		   re = num1 - num2;
		   break;
		  case Multiply:
		   re = num1 * num2;
		   break;
		  case Divide:
		   re = num1 / num2;
		   break;
		  default:
		   break;
		}
		return re;
    }

}

  

 

MessageServiceIceImpl .java实现发送消息 

package com.alan.generated.servant;

import java.util.Arrays;
import Ice.Current;
import com.alan.generated._MessageServiceIceDisp;
import com.alan.generated.model.Message;

/** 
 * @author zcq
 * @version 创建时间:2015-4-23 下午06:51:47 
 * 发送消息 
 */
public class MessageServiceIceImpl extends _MessageServiceIceDisp {
	public String sendMessage(Message msg, Current __current) {
		  String str = msg.getType() +" "+ msg.getAction()+" " + Arrays.toString(msg.getRelatedIds());
		     return str;
	}
}

 

 

IceService .java实现服务器端接口注册:

 

package com.alan.generated.server;

import Ice.Communicator;
import Ice.ObjectImpl;

import com.alan.generated.servant.CalcServiceIceImpl;
import com.alan.generated.servant.MessageServiceIceImpl;

/** 
 * @author zcq
 * @version 创建时间:2015-4-23 下午06:52:27 
 * 服务器端接口 
 */
public class IceService {
	public static void main(String[] args){
		   int status = 0;
		      Communicator ic = null;
		   try{
		   ic = Ice.Util.initialize(args);
		   Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("testAdapter", "tcp -h *");
		   ObjectImpl object1 = new MessageServiceIceImpl();
		   ObjectImpl object2 = new CalcServiceIceImpl();
		   adapter.add(object1, ic.stringToIdentity("messageService"));
		   adapter.add(object2, ic.stringToIdentity("calcService"));
		   adapter.activate();  
		   ic.waitForShutdown();  
		   } catch (Ice.LocalException e) {
		    e.printStackTrace();
		    status = 1;
		   } catch (Exception e) {
		    System.err.println(e.getMessage());
		    status = 1;
		   }
		  if (ic != null) {
		   try {
		    ic.destroy();
		   } catch (Exception e) {
		    System.err.println(e.getMessage());
		    status = 1;
		   }
		  }
		  System.exit(status);   
		 }
}

 

 

5,发布接口

  在项目下创建deploy文件夹,在其下创建config-ice.grid配置文件

IceGrid.InstanceName=IceTestServiceGrid    # 1
#
# The IceGrid locator proxy.
#
Ice.Default.Locator=IceTestServiceGrid/Locator:tcp -h 127.0.0.1 -p 9600     #2
#
# IceGrid registry configuration.
#
IceGrid.Registry.Client.Endpoints=tcp -h 127.0.0.1 -p 9600   #3
IceGrid.Registry.Server.Endpoints=tcp    #4
IceGrid.Registry.Internal.Endpoints=tcp  #5
IceGrid.Registry.Data=E:\eclipse_workspace\icetest2\db\rescenter_registry    #6
IceGrid.Registry.PermissionsVerifier=IceTestServiceGrid/NullPermissionsVerifier              #7
IceGrid.Registry.AdminPermissionsVerifier=IceTestServiceGrid/NullPermissionsVerifier         #8
IceGrid.Registry.SSLPermissionsVerifier=IceTestServiceGrid/NullSSLPermissionsVerifier        #9
IceGrid.Registry.AdminSSLPermissionsVerifier=IceTestServiceGrid/NullSSLPermissionsVerifier   #10

#
# IceGrid SQLconfiguration if using SQL database.
#
#Ice.Plugin.DB=IceGridSqlDB:createSqlDB     #11
#IceGrid.SQL.DatabaseType=QSQLITE      #12
#IceGrid.SQL.DatabaseName=register/Registry.db       #13
#

#
#Ice Error andStandard output Set
#
#Ice.StdErr=master/stderr.txt                  #14
#Ice.StdOut= master/stdout.txt    #15

#
#Trace Registryproperties
#
Ice.ProgramName=IceMaster     #16
IceGrid.Registry.Trace.Node=3        #17
IceGrid.Registry.Trace.Replica=3    #18


#
# IceGrid node configuration.
#
IceGrid.Node.Name=node1       #19
IceGrid.Node.Endpoints=tcp    #20
IceGrid.Node.Data=E:\eclipse_workspace\icetest2\db\node1    #21
IceGrid.Node.CollocateRegistry=1    #22
#IceGrid.Node.Output=db       #23
#IceGrid.Node.RedirectErrToOut=1    #24
  
#
# Trace properties.  
#
IceGrid.Node.Trace.Activator=1    #25
IceGrid.Node.Trace.Adapter=2      #26
IceGrid.Node.Trace.Server=3       #27


#
# Dummy username and password for icegridadmin.
#
IceGridAdmin.Username=foo    #28
IceGridAdmin.Password=bar    #29
#set server active Connection Managerment
#Ice.ACM.Server=60



#配置项说明:
   #1 为这个应用实例指定一个唯一的标识
   # 2  注册服务的端点信息(主注册服务和所有的从注册服务),节点注册时要用到
   # 3  客户端访问注册服务器的端点信息
   # 4  服务访问注册服务器的端点信息,通常是default
   # 5  内部访问端点信息,通常是default,节点用这个端口和注册服务通信
   # 6  注册服务的数据目录的路径
   # 7  设定防火墙安全代理,从而控制客户端访问注册表时可用的权限
   # 8  设定防火墙安全代理,从而控制注册表管理者可用的权限
   # 9  设定SSL安全代理,从而设定客户端访问注册表时的SSL安全访问机制
   # 10  设定SSL安全代理,从而设定注册表管理者的SSL安全访问机制
   # 11  指定Ice对象序列化的机制,如果不设置,默认用Freeze机制
   # 12  指定使用数据库的类型
   #13  指定使用数据库的名称
   #14  指定标准错误输出文件
   #15  指定标准输出文件
   #16  指定主注册服务的名称
   #17  指定主注册服务跟踪节点信息的级别(0~3),默认为0
   #18  指定主/从热备注册服务的跟踪级别(0~3),默认为0
   # 19  定义节点的名称,必须唯一
   # 20 节点被访问的端口信息,注册服务使用这个端点和节点通信,通常设为default
   # 21  节点的数据目录的路径
   # 22  定义节点是否和注册服务并置在一起,设为1时并置,设为0时不并置
   # 23  节点标准输出信息重定向蹈的目录路径,会自动生成输出文件
   # 24  节点上的服务程序的标准错误重定向到标准输出
   # 25  激活器跟踪级别,通常有0,1,2,3级,默认是0
   # 26  对象适配器跟踪级别,通常有0,1,2,3级,默认是0
   # 27  服务跟踪级别,通常有0,1,2,3级,默认是0
   # 28  IceGrid管理器登录该应用的用户名
   # 29  IceGrid管理器登录该应用的密码

 

 根据需要在当前目录下创建db/node1,db/rescenter_registry文件夹

创建application.xml文件

<icegrid>
 <application name="icetest2">
 
  <server-template id="icetest2-server-template">
	   <parameter name="index" />
	   <server id="rescenter_${index}" exe="C:/Program Files/Java/jdk1.7.0_15/bin/java" activation="on-demand">
		    <!---server -Xms128m -Xmx256m -d64 -XX:PermSize=128m-->
		    <option>-classpath</option>
		    <option>E:\eclipse_workspace\icetest2\src</option>
		    <option>-Djava.ext.dirs=E:\eclipse_workspace\icetest2\lib</option>
		    <option>-server</option>
		    <option>com.alan.generated.server.IceService</option>
		    <adapter name="testAdapter" endpoints="tcp" replica-group="ReplicatedTestAdapter" />
		    <property name="Ice.ThreadPool.Server.SizeMax" value="3000" />
	   </server>
  </server-template>
  
  <replica-group id="ReplicatedTestAdapter">
	  <load-balancing type="adaptive" load-sample="1" n-replicas="1" />
	  <object identity="messageService" type="::com::alan::generated::servant::MessageServiceIceImpl" />
	  <object identity="calcService" type="::com::alan::generated::servant::CalcServiceIceImpl" />
  </replica-group>
  
  <node name="node1">
  		<server-instance template="icetest2-server-template" index="1" />
  </node>
  
 </application>
</icegrid>

 

创建start_server.bat

path=%path%;D:/Program Files/ZeroC/Ice-3.5.1/bin
cd E:\eclipse_workspace\icetest2\deploy
icegridnode --Ice.Config=E:\eclipse_workspace\icetest2\deploy\config-ice.grid --deploy application.xml 
pause

 

创建完成后就可以双击start_server.bat来启动服务了

 

icegridnode --Ice.Config=config-ice.grid

 

 

6,创建客户端调用项目ICEClient,导入ice.jar以及前面生产的icetest.jar,在项目下创建IceClient .java

package com.alan.generated.client;

import java.util.HashMap;
import java.util.Map;

import Ice.Communicator;
import Ice.InitializationData;
import Ice.Util;

import com.alan.generated.CalcServiceIcePrx;
import com.alan.generated.CalcServiceIcePrxHelper;
import com.alan.generated.MessageServiceIcePrx;
import com.alan.generated.MessageServiceIcePrxHelper;
import com.alan.generated.model.ActionType;
import com.alan.generated.model.CalcType;
import com.alan.generated.model.Message;
import com.alan.generated.model.MessageType;

/** 
 * @author zcq
 * @version 创建时间:2015-4-23 下午07:09:44 
 * 客户端调用项目 
 */
public class IceClient {
	public static void main(String[] args){
	    int status = 0;  
	    Communicator ic = null;  
	    try{
	       String str = String.format("%s:%s -h %s -p %s", "IceTestServiceGrid/Locator","tcp" ,"127.0.0.1", "9600");
	       InitializationData localInitializationData = new InitializationData();
	       localInitializationData.properties = Util.createProperties();
	       localInitializationData.properties.setProperty("Ice.Default.Locator", str);
	       ic = Util.initialize(localInitializationData);
	          MessageServiceIcePrx messageclient = MessageServiceIcePrxHelper.checkedCast(ic.stringToProxy("messageService"));
	          CalcServiceIcePrx calcclient = CalcServiceIcePrxHelper.checkedCast(ic.stringToProxy("calcService"));  
	          if (messageclient == null || calcclient == null )  
	         throw new Error("Invalid proxy"); 
	          Map<String ,String > map = new HashMap<String, String>();
	       Message msg = new Message(MessageType.INFO, ActionType.Add,new int[]{1},map);
	       System.out.println(messageclient.sendMessage(msg));//调用接口完成消息发送
	       System.out.println(calcclient.calc(12, 4, CalcType.Adds));//调用接口完成数学计算
	    } catch (Ice.LocalException e) {
	      e.printStackTrace();
	      status = 1;
	    } catch (Exception e) {
	    System.err.println(e.getMessage());
	    status = 1;
	   }
	   if (ic != null) {
	   try {
	    ic.destroy();
	   } catch (Exception e) {
	    System.err.println(e.getMessage());
	    status = 1;
	   }
	  }
	     System.exit(status);
	 }
}

 

 

7,执行IceClient ,控制台输出

 

INFO Add [1]
16.0

 

到此调用成功,实例完成。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [ice 应用 实例] 推荐:

ICE应用实例(01):

- - 企业架构 - ITeye博客
本文接上篇博文《ICE通信框架》如果你还没有接触过ice请先阅读我的上篇博文 http://blog.csdn.net/liuzhoulong/archive/2011/03/04/6223450.aspx. 本文将结合实际项目,做一个基于 ice的实际项目实例应用,该实例完成客户端调用服务端接口完成消息发送,计算的功能.

Ice Cream Sandwich Google+ 2.0 和 Google Music 4.0 应用泄露 [下载]

- 可可 - 谷安——谷奥Android专题站
近几天可能大家都见到了一系列下一代 Nexus 手机以及 Android 的下一个版本 Ice Cream Sandwich(ICS)方面的消息. 目前一些新版本的 Android 应用也随之流出. 现在已经可以下载到新的 Google+ 2.0 应用以及新的 Google Music 4.0 应用.

Ice服务详解及应用_IceGrid(01)IceGrid负载均衡部署

- - 企业架构 - ITeye博客
【IceGrid负载均衡部署步骤】. 主机1:IP=192.168.0.239,上面部署注册表服务器registry和节点node1,registry和node1运行在同一进程中;. 主机2:IP=192.168.0.25,上面部署节点node2;. 其中每个节点中包含一个服务程序,服务程序均在节点启动时启动.

北极熊冰格:Polar Ice

- Zhen - 爱…稀奇~{新鲜:科技:创意:有趣}
爱稀奇引进过泰国Qualy的北极熊冰桶(Polar Ice Bucket),现在,我们来看看日本设计师Atsuhiro Hayashi的类似创意,北极熊冰格(Polar Ice):. 简单地说,这冰格像个圆筒,能制作出一只孤独的北极熊站在一大块浮冰上这种造型的冰块,将之加到饮料中,熊熊在浮力的作用下会高出水面,但是终究会因为冰块的融化而沉没…….

视频:Nexus Prime + Ice Cream Sandwich

- 骏骏 - 36氪
今天韩国网站Gadget.io拿到了一份泄露版的运行最新版的Ice Cream Sandwich系统的三星Nexus Prime手机视频. Nexus Prime是三星在10月11号即将发布的新手机,Ice Cream Sandwich是Google的下一代Android操作系统代号,这二个产品有望在11号那天一起发布.

ZEROC Ice 初步认识

- - 企业架构 - ITeye博客
ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,使我们能够以最小的代价构建分布式应用程序. ICE使我们专注于应用逻辑的开发,它来处理所有底层的网络接口编程,这样我们就不用去考虑这样的细节:打开网络连接、网络数据传输的序列化与反序列化、连接失败的尝试次数等.

hbase两个典型应用实例

- - CSDN博客推荐文章
本文介绍hbase的两个典型应用实例OpenTSDB和地理信息系统. 学习一种技术最好的办法就是了解一个正在使用的应用系统是如何应用这种技术来解决问题的. 其中开源的OPenTSDB数据监控系统就是应用hbase解决数据存储的. 同时hbase还能很好的应对地理信息系统(GIS)中的两个挑战:大规模数据处理的延迟和空间位置建模.

Android 4.0 Ice Cream Sandwich 截图曝出

- Vendetta - 爱范儿 · Beats of Bits
Ice Cream Sandwich 将是 Android 系统的一次重大升级,对此我们也非常期待,但是对于 ICS 的情况,Google 很少透露. RootzWiki 网站宣布从一个可靠的信息源得到 Android 4.0 的图片和信息. 根据该网站的说法,Ice Cream Sandwich 的开发仍处于“非常早期的阶段,功能并非 100% 可用.

Android Ice Cream Sandwich 截图首次泄露

- 请叫我火矞弟 - Engadget 中国版
继续阅读全文 Android Ice Cream Sandwich 截图首次泄露. 引用来源 | 引用来源 | 引用来源 | 此文章网址 | 转寄此文章 | 回应.

Android Ice Cream Sandwich 首张截图泄露

- Raining - cnBeta.COM
Android Ice Cream Sandwich 首张截图已经华丽地泄露出来,内部版本号是IRK36B,该版本运行在一台Nexus S上,用户界面出现了非常大的变化,图表配色转向蓝色,全新的launcher和应用程序抽屉,带来了新的GMail程序和相机的全景模式.