ICEBOX使用例

21461 ワード

システムインストールice 3.4.1環境変数を構成する.
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.");
 }