ICE應用實例

ICE應用實例 【收藏】

轉載學習 from
http://blog.csdn.net/liuzhoulong/archive/2011/03/07/6228333.aspx
thanks. 

本文接上篇博文《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實現數學計算:



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實現發送消息



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實現服務器端接口註冊:



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", "default -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

#
# The IceGrid locator proxy.
#
Ice.Default.Locator=IceTestServiceGrid/Locator:tcp -p 10000

#
# IceGrid registry configuration.
#
IceGrid.Registry.Client.Endpoints=tcp -p 10000
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.Data=db/rescenter_registry
IceGrid.Registry.PermissionsVerifier=IceTestServiceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=IceTestServiceGrid/NullPermissionsVerifier
IceGrid.Registry.SSLPermissionsVerifier=IceTestServiceGrid/NullSSLPermissionsVerifier
IceGrid.Registry.AdminSSLPermissionsVerifier=IceTestServiceGrid/NullSSLPermissionsVerifier

#
# Dummy username and password for icegridadmin.
#
IceGridAdmin.Username=foo
IceGridAdmin.Password=bar

#set server active Connection Managerment
Ice.ACM.Server=60
#
# IceGrid node configuration.
#

IceGrid.Node.Name=node1
IceGrid.Node.Endpoints=tcp
IceGrid.Node.Data=db/node1
IceGrid.Node.CollocateRegistry=1

IceGrid.Node.Trace.Activator=1
IceGrid.Node.Trace.Adapter=2
IceGrid.Node.Trace.Server=3

根據需要在當前目錄下創建db/node1,db/rescenter_registry文件夾

創建application.xml文件

<icegrid>
<application name="icetest">
<server-template id="icetest-server-template">
<parameter name="index" />
<server id="rescenter_${index}" exe="C:\Program Files\Java\jdk1.6.0_10\bin\java" activation="on-demand">
<!---server -Xms128m -Xmx256m -d64 -XX:PermSize=128m-->
<option>-classpath</option>
<option>E:\workspace\ICEServer\bin</option>
<option>-Djava.ext.dirs=E:\workspace\ICEServer\lib</option>
<option>-server</option>
<option>com.alan.ice.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::ice::MessageServiceIceImpl" />
<object identity="calcService" type="::com::alan::ice::CalcServiceIceImpl" />
</replica-group>
<node name="node1">
<server-instance template="icetest-server-template" index="1" />
</node>
</application>

</icegrid>

創建start_server.bat

path=%path%;E:\Ice-3.3.0\bin
icegridnode --Ice.Config=config-ice.grid --deploy application.xml
pause

創建完成後就可以雙擊start_server.bat來啓動服務了

6,創建客戶端調用項目ICEClient,導入ice.jar以及前面生產的icetest.jar,在項目下創建IceClient .java

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" ,"localhost", "10000");
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



到此調用成功,實例完成。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章