zeroc文檔不多,都是我採用「窮舉法「踩坑,一個一個摸索。java
1.首先在windows中安裝zeroc ice,在eclipse中安裝Ice Builder插件node
2.新建一個java項目(如上圖),而後用Ice Builder插件構建生成generated文件夾。在項目下新建文件夾slicewindows
3.在slice文件夾下新建service.ice和SMSService.ice(如上圖)eclipse
service.ice代碼以下:tcp
[["java:package:com.hp.tel.ice"]] module book{ struct Message{ string name; int type; bool valid; double price; string content; }; interface OnlineBook{ Message bookTick(Message msg); }; } ;
SMSService.ice代碼以下:ide
[["java:package:com.hp.tel.ice"]] module message{ interface SMSService{ void sendSMs(string msg); }; };
而後,會在generated文件下生成代碼。ui
4.OnlineBookI2.java 代碼以下:this
package com.hp.impl; import com.hp.tel.ice.book.Message; import com.hp.tel.ice.book._OnlineBookDisp; import Ice.Communicator; import Ice.Current; import Ice.ObjectAdapter; import IceBox.Service; public class OnlineBookI2 extends _OnlineBookDisp implements Service{ private ObjectAdapter _adapter; private static final long serialVersionUID = 3419811003893579926L; @Override public Message bookTick(Message s, Current __current) { System.out.println(" bookTick to call. "+this.getClass().getName()); System.out.println(s.content); return s; } @Override public void start(String name, Communicator communicator, String[] args) { _adapter = communicator.createObjectAdapter(name); Ice.Object object = this; _adapter.add(object, communicator.stringToIdentity(name)); _adapter.activate(); System.out.println(name +" started"); } @Override public void stop() { System.out.println(this._adapter.getName()+" stopped"); _adapter.destroy(); } }
5.SMSServiceI2.java代碼以下:spa
package com.hp.impl; import com.hp.tel.ice.book.Message; import com.hp.tel.ice.book.OnlineBookPrx; import com.hp.tel.ice.book.OnlineBookPrxHelper; import com.hp.tel.ice.message._SMSServiceDisp; import Ice.Communicator; import Ice.Current; import Ice.ObjectAdapter; import IceBox.Service; public class SMSServiceI2 extends _SMSServiceDisp implements Service{ private static final long serialVersionUID = 8374639098846448601L; private ObjectAdapter _adapter; @Override public void sendSMs(String msg, Current __current) { System.out.println("send msag "+msg); if(msg.startsWith("book")) { try { Ice.ObjectPrx base = _adapter.getCommunicator().stringToProxy("OnlineBook"); OnlineBookPrx onlineBook = OnlineBookPrxHelper.checkedCast(base); Message bookMsg = new Message(); bookMsg.name = "Mr Wang"; bookMsg.type = 3; bookMsg.price = 99.99; bookMsg.valid = true; bookMsg.content = "abcdef"; onlineBook.bookTick(bookMsg); } catch (Exception e) { throw new RuntimeException(e); } } } @Override public void start(String name, Communicator communicator, String[] args) { _adapter = communicator.createObjectAdapter(name); Ice.Object object = this; _adapter.add(object, communicator.stringToIdentity(name)); _adapter.activate(); System.out.println("SMS started"); } @Override public void stop() { System.out.println("SMS stoped"); _adapter.destroy(); } }
6.OnlineBookClient.java代碼以下:插件
package com.hp.client; import com.hp.tel.ice.book.Message; import com.hp.tel.ice.book.OnlineBookPrx; import com.hp.tel.ice.book.OnlineBookPrxHelper; public class OnlineBookClient { public static void main(String[] args) { int status = 0; Ice.Communicator ic = null; try { ic = Ice.Util.initialize(args); Ice.ObjectPrx base = ic.stringToProxy("OnlineBook:default -p 10000"); OnlineBookPrx onlineBook = OnlineBookPrxHelper.checkedCast(base); if(onlineBook==null) { throw new Error("Invalid proxy"); } //調用服務方法 Message msg = new Message(); msg.name = "Mr Wang"; msg.type = 3; msg.price = 99.99; msg.valid = true; msg.content = "aaaaa"; System.out.println(onlineBook.bookTick(msg).content); } catch (Exception e) { e.printStackTrace(); status = 1; }finally { if(ic!=null) { ic.destroy(); } } System.exit(status); } }
7.SMSServiceClient.java代碼以下:
package com.hp.client; import com.hp.tel.ice.book.Message; import com.hp.tel.ice.book.OnlineBookPrx; import com.hp.tel.ice.book.OnlineBookPrxHelper; import com.hp.tel.ice.message.SMSServicePrx; import com.hp.tel.ice.message.SMSServicePrxHelper; import Ice.AsyncResult; import Ice.Callback; public class SMSServiceClient { public static void main(String[] args) { int status = 0; Ice.Communicator ic = null; try { // ic = Ice.Util.initialize(new String[] {"--Ice.Default.Locator=DemoIceGrid/Locator:tcp -h localhost -p 4061"}); Ice.ObjectPrx objectPrx = ic.stringToProxy("SMSService@SMSServiceAdapter"); SMSServicePrx smsService = SMSServicePrxHelper.checkedCast(objectPrx); if(smsService==null) { throw new Error("Invalid proxy"); } System.out.println("123"); smsService.sendSMs("aook"); /*OnlineBookPrx onlineBook = OnlineBookPrxHelper.checkedCast(base); if(onlineBook==null) { throw new Error("Invalid proxy"); } //調用服務方法 Message msg = new Message(); msg.name = "Mr Wang"; msg.type = 3; msg.price = 99.99; msg.valid = true; msg.content = "aaaaa"; System.out.println(onlineBook.bookTick(msg).content);*/ } catch (Exception e) { e.printStackTrace(); status = 1; }finally { if(ic!=null) { ic.destroy(); } } System.exit(status); } }
8.config.properties
#server properties IceBox.InstanceName = MyAppIceBox 1 IceBox.InheritProperties = 1 IceBox.PrintServicesReady = MyAppIceBox 1 IceBox.ServiceManager.Endpoints =tcp -p 9998 -h localhost #performance properties Ice.ThreadPool.Server.Size = 4 Ice.ThreadPool.Server.SizeMax = 100 Ice.ThreadPool.Server.SizeWarn = 40 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.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 define begin IceBox.Service.OnlineBook = com.hp.impl.OnlineBookI2 prop1=1 prop2=2 prop3=3 OnlineBook.Endpoints =tcp -p 10000 -h localhost IceBox.Service.SMSService = com.hp.impl.SMSServiceI2 SMSService.Endpoints = tcp -p 10001 -h localhost #service load order IceBox.LoadOrder=OnlineBook,SMSService IceBox.UseSharedCommunicator.OnlineBook=1 IceBox.UseSharedCommunicator.SMSService=1 #Ice Registry Ice.Default.Locator=DemoIceGrid/Locator:tcp -h localhost -p 4061 OnlineBook.AdapterId=OnlineBookAdapter SMSService.AdapterId=SMSServiceAdapter
注意注意這個DemoIceGrid與後面的registry.cfg中的IceGrid.InstanceName=DemoIceGrid相對應
重要的事情說三遍!!!
9.
在E盤下新建TestIce文件夾,在這個文件夾下新建registry.cfg和node1.cfg,配置文件中有路徑設置,請本身設置,不然報錯
registry.cfg代碼以下:
#IceGrid instance name. 實例名 IceGrid.InstanceName=DemoIceGrid IceGrid.Registry.Client.Endpoints=tcp -h localhost -p 4061 IceGrid.Registry.Server.Endpoints=tcp -h localhost IceGrid.Registry.Internal.Endpoints=tcp -h localhost IceGrid.Registry.PermissionsVerifier=DemoIceGrid/NullPermissionsVerifier IceGrid.Registry.Data=E:\registry IceGrid.Registry.DynamicRegistration=1
node1.cfg代碼以下:
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h localhost -p 4061 IceGrid.Node.Data=E:\TestIce\node\data IceGrid.Node.Endpoints=tcp -p 5062 #指定節點1的名稱 IceGrid.Node.Name=node1 Ice.StdErr E:\TestIce\node\node.stderr.log #指定錯誤日誌文件 Ice.StdOut E:\TestIce\node\node.stdout.log
10.在E:\TestIce目錄下打開cmd.exe
輸入icegridregistry --Ice.Config=registry.cfg 啓動registry
輸入 icegridnode --Ice.Config=node1.cfg 啓動node
11.eclipse中啓動配置如圖:
點擊項目名稱--> run as -->
OK完結