Zeroc ICE 之zeroc Registry(Java)

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完結

相關文章
相關標籤/搜索