ICEBOX使用例
21461 ワード
システムインストールice 3.4.1環境変数を構成する.
sliceファイルの定義
これは2つのインタフェース、1つのOnlineBook、1つのSMSServiceがあり、comに位置していることを示しています.hhly.tel.ice.bookの下.
JAVAクラスの生成
slice 2 java xxを使用します.ice生成
生成されたクラスをプロジェクトにコピーします
上の図の赤いのはiceが生成したクラスです.
自分たちの論理を実現する
上の図のサービスの下には、OnlineBookとSMSServiceの実装があり、コードは以下の通りです.
iceboxのプロファイル:
IceBox.Service.name=entry_ポイント[–key=value][args]各パラメータの定義:nameはサービスの名前を定義し、上に2つのサービス、1つのOnlineBook、1つのSMSServiceが定められている.entry_ポイントはサービスの完全なクラス名(-key=value)であり、このサービスを構築するためのcommunicatorは、各Iceサービスのパフォーマンスの最適化をより正確に制御するためにproperty属性として使用され、ここでも–Iceを使用することができる.Config=xxx.cfgは、特定のプロファイルからパラメータをロードします.IceBox.InheritProperties=1で、すべてのiceサービスにIceBoxの構成プロパティを使用させます.[args]パラメータとしてstart()メソッドに伝達されるargsパラメータは、サービス側起動初期化パラメータとして使用される.
Ice.MessageSizeMax:大きなパケットを作るバイト数Ice.Trace.Network=1,ネットワークイベントに関するログ追跡Iceをオンにする.Trace.ThreadPool=1、スレッドプールイベントのログ追跡Iceをオンにする.Trace.Locator=1、Locatorオブジェクトのログトレースをオンにします
IceBox.UseShardedCommunicator.ServiceName=1は、サービスローカルコールの最適化を実現します.上記のOnlineBookとSMSServiceのように、同じIceBoxに配置され、同じCommunicatorオブジェクトを使用してローカル呼び出しの最適化を定義します.
IceBox.LoadOrder=serv 1,serv 2,serv 3,上記のOnlineBookやSMSServiceのようなサービスのロード順を指定します.
サービスを開始し、
クライアントの作成と起動
ICEサービス間の呼び出し
ICESMSServiceの実装方法は以下のように変更されました.
上のコードは、nameがbookで始まると、OnlineBookServiceを内部的に呼び出して図書を購入することを示しています.さもないとメールを送ります.
試験:クライアントコード:
sliceファイルの定義
[[ "java:package:com.hhly.tel.ice"]]
module book {
interface OnlineBook {
void bookTick(string name,double price,string content);
};
interface SMSService {
void sendSMS(string name,double price,string content);
};
};
これは2つのインタフェース、1つのOnlineBook、1つのSMSServiceがあり、comに位置していることを示しています.hhly.tel.ice.bookの下.
JAVAクラスの生成
slice 2 java xxを使用します.ice生成
生成されたクラスをプロジェクトにコピーします
上の図の赤いのはiceが生成したクラスです.
自分たちの論理を実現する
上の図のサービスの下には、OnlineBookとSMSServiceの実装があり、コードは以下の通りです.
package com.hhly.tel.ice.book.service;
import Ice.Communicator;
import Ice.Current;
import Ice.ObjectAdapter;
import IceBox.Service;
import com.hhly.tel.ice.book._OnlineBookDisp;
import org.apache.log4j.Logger;
/**
* @Author j.tommy
* @Date 2016/6/19 0019 4:08
*/
public class ICEBookService extends _OnlineBookDisp implements Service{
public static final Logger log = Logger.getLogger(ICEBookService.class);
private ObjectAdapter _adapter;
@Override
public void bookTick(String name, double price, String content, Current __current) {
log.info("Call bookTick()...params->[name=" + name + ",price=" + price + ",content=" + content + "].");
}
@Override
public void start(String name, Communicator communicator, String[] strings) {
// objectAdapter, service
_adapter = communicator.createObjectAdapter(name);
// Serant
Ice.Object object = this;
_adapter.add(object,communicator.stringToIdentity(name));
_adapter.activate();
log.info(name + " started.");
}
@Override
public void stop() {
log.info(this._adapter.getName() + " stoped.");
_adapter.destroy();
}
}
package com.hhly.tel.ice.book.service;
import Ice.Communicator;
import Ice.Current;
import Ice.ObjectAdapter;
import IceBox.Service;
import com.hhly.tel.ice.book._SMSServiceDisp;
import org.apache.log4j.Logger;
/**
* @Author j.tommy
* @Date 2016/6/19 0019 4:08
*/
public class ICESMSService extends _SMSServiceDisp implements Service{
public static final Logger log = Logger.getLogger(ICESMSService.class);
private ObjectAdapter _adapter;
@Override
public void start(String name, Communicator communicator, String[] strings) {
// objectAdapter, service
_adapter = communicator.createObjectAdapter(name);
// Serant
Ice.Object object = this;
_adapter.add(object,communicator.stringToIdentity(name));
_adapter.activate();
log.info(name + " started.");
}
@Override
public void stop() {
log.info(this._adapter.getName() + " stoped.");
_adapter.destroy();
}
@Override
public void sendSMS(String name, double price, String content, Current __current) {
log.info("Call sendSMS()...params->[name=" + name + ",price=" + price + ",content=" + content + "].");
}
}
iceboxのプロファイル:
#server properties
# icebox
IceBox.InstanceName=MyAppIceBox 1
# =1 Icebox
IceBox.InheritProperties=1
# =1 icebox MyAppIceBox 1 ready
IceBox.PrintServicesReady=MyAppIceBox 1
#IceBox , , , 9999
IceBox.ServiceManager.Endpoints=tcp -p 8989 -h localhost
#performance properties
Ice.ThreadPool.Server.Size=4
Ice.ThreadPool.Server.SizeMax=100
Ice.ThreadPool.Server.SizeWarn=10
Ice.ThreadPool.Client.Size=4
Ice.ThreadPool.Client.SizeMax=100
Ice.ThreadPool.Client.SizeWarn=40
#for system stronger
Ice.ACM.Client=300
Ice.ACM.Server=300
#log and trace
# , 。
#Ice.LogFile=iceserv.log
Ice.PrintStackTraces=1
Ice.Trace.Retry=2
Ice.Trace.Network=2
Ice.Trace.ThreadPool=1
Ice.Trace.Locator=2
Ice.Warn.Connections=1
Ice.Warn.Dispatch=1
Ice.Warn.Endpoints=1
#service defined begin
IceBox.Service.OnlineBook=com.hhly.tel.ice.book.service.ICEBookService prop1=1 prop2=2 prop3=3
IceBox.Service.SMSService=com.hhly.tel.ice.book.service.ICESMSService
OnlineBook.Endpoints=tcp -p 9000 -h localhost
SMSService.Endpoints=tcp -p 9001 -h localhost
#service defined end
#server load order
IceBox.LoadOrder=OnlineBook,SMSService
#service share communicator
IceBox.UseSharedCommunicator.OnlineBook=1
IceBox.UseSharedCommunicator.SMSService=1
IceBox.Service.name=entry_ポイント[–key=value][args]各パラメータの定義:nameはサービスの名前を定義し、上に2つのサービス、1つのOnlineBook、1つのSMSServiceが定められている.entry_ポイントはサービスの完全なクラス名(-key=value)であり、このサービスを構築するためのcommunicatorは、各Iceサービスのパフォーマンスの最適化をより正確に制御するためにproperty属性として使用され、ここでも–Iceを使用することができる.Config=xxx.cfgは、特定のプロファイルからパラメータをロードします.IceBox.InheritProperties=1で、すべてのiceサービスにIceBoxの構成プロパティを使用させます.[args]パラメータとしてstart()メソッドに伝達されるargsパラメータは、サービス側起動初期化パラメータとして使用される.
Ice.MessageSizeMax:大きなパケットを作るバイト数Ice.Trace.Network=1,ネットワークイベントに関するログ追跡Iceをオンにする.Trace.ThreadPool=1、スレッドプールイベントのログ追跡Iceをオンにする.Trace.Locator=1、Locatorオブジェクトのログトレースをオンにします
IceBox.UseShardedCommunicator.ServiceName=1は、サービスローカルコールの最適化を実現します.上記のOnlineBookとSMSServiceのように、同じIceBoxに配置され、同じCommunicatorオブジェクトを使用してローカル呼び出しの最適化を定義します.
IceBox.LoadOrder=serv 1,serv 2,serv 3,上記のOnlineBookやSMSServiceのようなサービスのロード順を指定します.
サービスを開始し、
package com.hhly.tel.ice.book.client;
/**
* @Author j.tommy
* @Date 2016/6/19 0019 4:33
*/
public class Server {
public static void main(String[] args) {
IceBox.Server server = new IceBox.Server();
server.main(new String[]{"--Ice.Config=icebox.properties"});
}
}
クライアントの作成と起動
package com.hhly.tel.ice.book.client;
import com.hhly.tel.ice.book.*;
/**
* @Author j.tommy
* @Date 2016/6/19 0019 4:27
*/
public class Client {
public static void main(String[] args) {
// OnlineBook
bookTick(args);
// SMSService
sendSMS(args);
}
private static void bookTick(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args);
Ice.ObjectPrx base = ic.stringToProxy("OnlineBook:default -p 9000");
OnlineBookPrx onlineBookPrx = OnlineBookPrxHelper.checkedCast(base);
if (onlineBookPrx == null) {
throw new Error("Invalid proxy");
}
onlineBookPrx.bookTick("ICE ",59," ICE 。");
} catch (Error error) {
error.printStackTrace();
status = 1;
} finally {
if (ic != null) {
ic.destroy();
}
// System.exit(status);
}
}
private static void sendSMS(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args);
Ice.ObjectPrx base = ic.stringToProxy("SMSService:default -p 9001");
SMSServicePrx smsServicePrx = SMSServicePrxHelper.checkedCast(base);
if (smsServicePrx == null) {
throw new Error("Invalid proxy");
}
smsServicePrx.sendSMS("ICE ",59," ICE 。");
} catch (Error error) {
error.printStackTrace();
status = 1;
} finally {
if (ic != null) {
ic.destroy();
}
System.exit(status);
}
}
}
ICEサービス間の呼び出し
ICESMSServiceの実装方法は以下のように変更されました.
@Override
public void sendSMS(String name, double price, String content, Current __current) {
if (name.startsWith("book")) {
Ice.ObjectPrx base = _adapter.getCommunicator().stringToProxy("OnlineBook");
OnlineBookPrx onlineBookPrx = OnlineBookPrxHelper.checkedCast(base);
if (null != onlineBookPrx) {
onlineBookPrx.bookTick(name,price,content);
log.info(" !...params->[name=" + name + ",price=" + price + ",content=" + content + "].");
}
else {
throw new Error("Can't find OnlinkBook Service.");
}
}
else {
log.info(" ...params->[name=" + name + ",price=" + price + ",content=" + content + "].");
}
}
上のコードは、nameがbookで始まると、OnlineBookServiceを内部的に呼び出して図書を購入することを示しています.さもないとメールを送ります.
試験:クライアントコード:
private static void sendSMS(String name,double price,String content,String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args);
Ice.ObjectPrx base = ic.stringToProxy("SMSService:default -p 9001");
SMSServicePrx smsServicePrx = SMSServicePrxHelper.checkedCast(base);
if (smsServicePrx == null) {
throw new Error("Invalid proxy");
}
smsServicePrx.sendSMS(name,price,content);
} catch (Error error) {
error.printStackTrace();
status = 1;
} finally {
if (ic != null) {
ic.destroy();
}
// System.exit(status);
}
}
public static void main(String[] args) {
// OnlineBook
bookTick(args);
System.out.println("bookTick(args) Finished");
// SMSService
sendSMS("book ICE ",59," ICE 。",args);
System.out.println("sendSMS() Finished");
// SMSService OnlineBookService, ICE
sendSMS(" ",59," ICE 。",args);
System.out.println("Send Message Finished.");
}