クラスタとネーミングコンテキストが酷似していても,コンテキストにはクラスタと無関係のメソッドがあります。例えば,ネーミングコンテキストをクラスタにバインドしても無意味です。クラスタにはネーミングコンテキストではなくオブジェクトリファレンスの集合が入るためです。ただし,クラスタインタフェースは,bind,rebind,resolve,unbind,listなどNamingContextと同じメソッドを多く持っています。これらのオペレーションは,主にグループに対するオペレーションに関係します。クラスタ固有オペレーションはpickだけです。両者の重要な違いのもう一つは,クラスタは複合名をサポートしないということです。クラスタは階層ディレクトリ構造を持たないで,フラット構造でオブジェクトリファレンスを格納するので,コンポーネントを一つだけ持つ名前だけを使用できます。
module CosNamingExt {
typedef sequence<Cluster> ClusterList;
enum ClusterNotFoundReason {
missing_node,
not_context,
not_cluster_context
};
exception ClusterNotFound {
ClusterNotFoundReason why;
CosNaming::Name rest_of_name;
};
exception Empty {};
interface Cluster {
Object select() raises(Empty);
void bind(in CosNaming::NameComponent n, in Object obj)
raises(CosNaming::NamingContext::CannotProceed,
CosNaming::NamingContext::InvalidName,
CosNaming::NamingContext::AlreadyBound);
void rebind(in CosNaming::NameComponent n, in Object obj)
raises(CosNaming::NamingContext::CannotProceed,
CosNaming::NamingContext::InvalidName);
Object resolve(in CosNaming::NameComponent n)
raises(CosNaming::NamingContext::NotFound,
CosNaming::NamingContext::CannotProceed,
CosNaming::NamingContext::InvalidName);
void unbind(in CosNaming::NameComponent n)
raises(CosNaming::NamingContext::NotFound,
CosNaming::NamingContext::CannotProceed,
CosNaming::NamingContext::InvalidName);
void destroy()
raises(CosNaming::NamingContext::NotEmpty);
void list(in unsigned long how_many,
out CosNaming::BindingList bl,
out CosNaming::BindingIterator bi);
} ;
};
CosNamingExt module {
interface ClusterManager {
Cluster create_cluster(in string algo);
Cluster find_cluster(
in CosNaming::NamingContext ctx, in CosNaming::Name n)
raises(ClusterNotFound,
CosNaming::NamingContext::CannotProceed,
CosNaming::NamingContext::InvalidName);
Cluster find_cluster_str(
in CosNaming::NamingContext ctx, in string n)
raises(ClusterNotFound,
CosNaming::NamingContext::CannotProceed,
CosNaming::NamingContext::InvalidName);
ClusterList clusters();
};
};