Zeroc Ice grid 연구 학습
개념
slice: ice는 자신의 인터페이스 정의 언어를 제공합니다.rpc의 인터페이스와 대상을 정의하는 데 사용됩니다.
ice.object: rpc에서 호출된 인터페이스는 ice에서 계승해야 합니다.Object
servant:ice.Object의 실례화 대상은 servant라고 하는데 rpc가 호출하는 것이 바로 servant 대상이기 때문에 servant는 라인 보안이 필요합니다.
endpoints: 클라이언트 rpc 호출 서버 주소
icebox:servant 용기
icenode:icebox 용기
registry: 등록 센터, icenode의 등록을 관리하고 발표를 책임집니다.
2. 배치
단계:
셋째, 프로필
registry 프로필 하나:registry.cfg
node 프로필 n개:node1.cfg, node2.cfg
설명 파일 app 적용.xml
프로필 상세 정보:
registry.cfg
# grid
IceGrid.InstanceName=SzcIceGrid
#
IceGrid.Registry.Client.Endpoints=tcp -p 4061
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.PermissionsVerifier=SzcIceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=SzcIceGrid/NullPermissionsVerifier
# ,
IceGrid.Registry.Data=/data/shizc/Desktop/ice/registry
IceGrid.Registry.DynamicRegistration=1
Ice.Admin.InstanceName=AdminInstance
Ice.Admin.ServerId=Admin
node1.cfg
#
Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 192.168.7.7 -p 4061
#node
IceGrid.Node.Name=node1
IceGrid.Node.Endpoints=tcp
#node
IceGrid.Node.Data=/data/shizc/Desktop/ice/nodes/node1
IceGrid.Node.Output=/data/shizc/Desktop/ice/nodes/node1
IceGrid.Node.CollocateRegistry=0
#IceGrid.Node.Trace.Replica=2
#IceGrid.Node.Trace.Activator=3
#IceGrid.Node.Trace.Adapter=3
#IceGrid.Node.Trace.Server=3
node2.cfg
#
Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 192.168.7.7 -p 4061
IceGrid.Node.Name=node2
IceGrid.Node.Endpoints=tcp
IceGrid.Node.Data=/data/shizc/Desktop/ice/nodes/node2
IceGrid.Node.Output=/data/shizc/Desktop/ice/nodes/node2
IceGrid.Node.CollocateRegistry=0
#IceGrid.Node.Trace.Replica=2
#IceGrid.Node.Trace.Activator=3
#IceGrid.Node.Trace.Adapter=3
#IceGrid.Node.Trace.Server=3
app.xml
<icegrid>
<application name="FileSystemApp">
<properties id="MultiThreaded" >
<property name="Ice.PrintStackTraces" value="1" ></property>
<property name="IceSSL.Trace.Security" value="2" ></property>
<property name="Ice.ThreadPool.Client.Size" value="2" ></property>
<property name="Ice.ThreadPool.Client.SizeMax" value="50" ></property>
<property name="Ice.ThreadPool.Server.Size" value="10" ></property>
<property name="Ice.ThreadPool.Server.SizeMax" value="100" ></property>
<property name="IceBox.InheritProperties" value="1" ></property>
<property name="Ice.Override.ConnectTimeout" value="5000" ></property>
<property name="Ice.Override.Timeout" value="10000" ></property>
<property name="IceBox.Trace.ServiceObserver" value="1" ></property>
<property name="Ice.Default.LocatorCacheTimeout" value="300" ></property>
<property name="Ice.BackgroundLocatorCacheUpdates" value="1" ></property>
</properties>
<!-- -->
<server-template id="FileSystemServerIceBoxTemplate">
<parameter name="index" default="0"></parameter>
<!-- exe java -->
<icebox id="FileSystemServerIceBox${index}" exe="java" activation="on-demand" >
<properties>
<properties refid="MultiThreaded" />
</properties>
<option>-Xmx512M</option>
<!-- icebox main -->
<option>IceBox.Server</option>
<!-- -->
<env>CLASSPATH=.:/usr/share/java/*:/data/shizc/Desktop/ice/bin</env>
<!-- entry icebox service, replica-group endpoints -->
<service name="FilesystemService" entry="service.FilesystemService">
<adapter name="FilesystemService" id="FilesystemService${index}" endpoints="default" replica-group="FilesystemServiceRep" ></adapter>
</service>
</icebox>
</server-template>
<replica-group id="FilesystemServiceRep">
<load-balancing type="round-robin" n-replicas="0" />
<!-- servant -->
<object identity="RootDir" type="::filesystem::Directory"></object>
<object identity="iamfile" type="::filesystem::File"></object>
</replica-group>
<!-- node 2 icebox -->
<node name="node1">
<server-instance template="FileSystemServerIceBoxTemplate" index="11"></server-instance>
<server-instance template="FileSystemServerIceBoxTemplate" index="12"></server-instance>
</node>
<node name="node2">
<server-instance template="FileSystemServerIceBoxTemplate" index="21"></server-instance>
<server-instance template="FileSystemServerIceBoxTemplate" index="22"></server-instance>
</node>
</application>
</icegrid>
4. 시동
5. 코드
슬라이스 정의:
[["java:package:com.asto"]]
module filesystem{
interface Node{
string name();
};
exception GenericError{
string reason;
};
sequence<string> Lines;
interface File extends Node{
Lines read();
void write(Lines text) throws GenericError;
};
sequence<Node*> NodeSeq;
interface Directory extends Node{
NodeSeq list();
};
interface FileSys{
Directory* getRoot();
};
};
eclipse 플러그인이나 명령을 통해 slice2java를 자바 클래스로 변환하기
Directory 및 File 인터페이스 구현
package servant;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import com.asto.filesystem.NodePrx;
import com.asto.filesystem.NodePrxHelper;
import com.asto.filesystem._DirectoryDisp;
import Ice.Current;
public class DirectoryI extends _DirectoryDisp {
public static Ice.ObjectAdapter _adapter;
public String _name;
public DirectoryI _parent;
public List<NodePrx> _content = new ArrayList<NodePrx>();
public DirectoryI(String _name, DirectoryI _parent) {
super();
this._name = _name;
this._parent = _parent;
Ice.Identity theId = Ice.Util.stringToIdentity(_parent == null ? "RootDir" : UUID.randomUUID().toString());
_adapter.add(this, theId);
//
NodePrx theNode = NodePrxHelper.uncheckedCast(_adapter.createProxy(theId));
//
if (_parent != null) {
_parent.addChild(theNode);
}
}
@Override
public NodePrx[] list(Current __current) {
System.out.println("[DirectoryI]invoke list @" + Thread.currentThread().getName());
NodePrx[] retList = new NodePrx[_content.size()];
retList = _content.toArray(retList);
return retList;
}
@Override
public String name(Current __current) {
System.out.println("[DirectoryI]invoke name @"+ Thread.currentThread().getName());
return _name;
}
void addChild(NodePrx child) {
System.out.println("[DirectoryI]invoke addChild @"+ Thread.currentThread().getName());
_content.add(child);
}
}
package servant;
import java.util.UUID;
import com.asto.filesystem.GenericError;
import com.asto.filesystem.NodePrx;
import com.asto.filesystem.NodePrxHelper;
import com.asto.filesystem._FileDisp;
import Ice.Current;
public class FileI extends _FileDisp {
public static Ice.ObjectAdapter _adapter;
public String _name;
public DirectoryI _parent;
public String[] _lines;
public FileI(String _name, DirectoryI _parent) {
super();
this._name = _name;
this._parent = _parent;
assert(_parent != null);
String identiyName = UUID.randomUUID().toString();
if("README".equalsIgnoreCase(_name)){
identiyName = "iamfile";
}
System.out.println("FileI'identiy:"+identiyName);
Ice.Identity theId = Ice.Util.stringToIdentity(identiyName);
_adapter.add(this, theId);
NodePrx theNode = NodePrxHelper.uncheckedCast(_adapter.createProxy(theId));
_parent.addChild(theNode);
}
@Override
public String[] read(Current __current) {
System.out.println("[FileI]invoke read @"+ Thread.currentThread().getName());
return _lines;
}
@Override
public void write(String[] text, Current __current) throws GenericError {
System.out.println("[FileI]invoke write @"+ Thread.currentThread().getName());
_lines = text;
}
@Override
public String name(Current __current) {
System.out.println("[FileI]invoke name @"+ Thread.currentThread().getName());
return _name;
}
}
이 두 인터페이스의 실현 클래스에는 Ice가 포함되어 있습니다.ObjectAdapter, servant는 adapter를 통해 대외적으로 서비스를 제공해야 합니다.
구조 방법에서adapter에 자신의 실례(servant)를 추가합니다.
Icebox의 서비스 인터페이스를 구현합니다.
package service;
import com.asto.filesystem.GenericError;
import Ice.Communicator;
import IceBox.Service;
import servant.DirectoryI;
import servant.FileI;
public class FilesystemService implements Service {
private Ice.ObjectAdapter _adapter;
@Override
public void start(String name, Communicator communicator, String[] args) {
_adapter = communicator.createObjectAdapter(name);
DirectoryI._adapter = _adapter;
FileI._adapter = _adapter;
DirectoryI root = new DirectoryI("/", null);
FileI file = new FileI("README", root);
String[] text = new String[] { "This file system contain a collection of poetry." };
try {
file.write(text);
} catch (GenericError e) {
System.err.println(e.reason);
}
DirectoryI coleridge = new DirectoryI("Coleridge", root);
file = new FileI("Kubla_Khan", coleridge);
text = new String[] { "In Xanadu did Kubla Khan", "A stately pleasure-dome decree:", "Where Alph, the sacred river, ran", "Through caverns measureless to man", "Down to a sunless sea." };
try {
file.write(text);
} catch (GenericError e) {
System.err.println(e.reason);
}
_adapter.activate();
System.out.println("FileSystemServer adapter activate @" + Thread.currentThread().getName());
}
@Override
public void stop() {
System.out.println(getClass().getName() + " _adapter destroy @" + Thread.currentThread().getName());
if(_adapter != null){
_adapter.destroy();
}
}
}
FileSystemService는 app에 있습니다.xml에서 Icebox로 설정합니다.
client 호출:
public static void main(String[] args){
Ice.Communicator ic = null;
try{
ic = Ice.Util.initialize(args);
// Ice.ObjectPrx basePrx = ic.stringToProxy("iamfile");
// FilePrx detailPrx = FilePrxHelper.checkedCast(basePrx);
Ice.ObjectPrx basePrx = ic.stringToProxy("RootDir");
DirectoryPrx detailPrx = DirectoryPrxHelper.checkedCast(basePrx);
if(detailPrx == null){
System.err.println("filePrx is null");
System.exit(1);
}
String name = detailPrx.name();
System.out.println("fileName is :" + name);
}catch(Exception e){
e.printStackTrace();
}finally{
if(ic != null){
ic.shutdown();
ic.waitForShutdown();
ic.destroy();
}
}
}
client 실행은registry 주소를 지정하는 설정 파일을 추가해야 합니다
client.cfg
Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 192.168.7.7 -p 4061
client를 실행할 때 설정 파일을 지정합니다
java com.client.Client --Ice.Config=client.cfg
인용
'Zeroc Ice 권위 가이드'와http://blog.csdn.net/lihuayong/article/details/9901417
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.