ICE笔记(07):Ice属性和配置

colorado 】

 

按:摘编自DPWI第30章

 

通过配置文件可以设置Ice应用程序的各个方面,Ice运行时能够识别配置文件中规定的属性集。Ice只会在创建通信器时读入属性配置。也就是说,若要设置属性的话,必须在创建通讯器以前设置,否则不起作用。

1、配置文件:
以#开头部分为注释。属性单词之间可以有空格。属性前、后空格自动清除,中间的空格会保留。

属性格式:<应用程序名>.<类别名>[.<子类别名>]。
以Ice,IceBox,IceGrid,IcePatch2,IceSSL,IceStorm,Freeze,Glacier2 为前缀的属性专用于Ice运行时,不能用于用户程序和配置。

配置文件可通过环境变量ICE_CONFIG指定,也可以在命令行指定:
server --Ice.Config=/usr/local/server.config, ./server.config
属性也可以在命令行上指定:
server  --Ice.MessageSizeMax=4096 --Ice.Config=/usr/local/server.config
无论命令行指定的属性在前,还是在后,命令行指定的属性总是会覆盖配置文件中的同名属性。

2、命令行分析、初始化
$ ./server --myoption --Ice.Config=server.config -x --Ice.Trace.Network=3 -y

当通讯器执行初始化语句:

// ...
Ice::CommunicatorPtr ic;
// ...
ic = Ice::initialize(argc, argv);
// ...


initialize返回时,argv中包含的形参向量为:--myoption –x –y;与Ice相关参数均被传给Ice运行时,并从形参向量中删除,留给应用程序的只是应用程序特定的参数向量。Ice:Application的run函数具有类似功能,传入run函数的参数向量只含有应用程序特定的形参向量。Ice相关形参
向量已在调用run函数前,由Ice:Application处理,并传给了Ice运行时。

Ice.ProgramName属性(argv[0])为应用程序名称。

3、编程操作属性
可以通过通讯器的属性方法操作属性。

3.1、读取属性
getProperty:返回指定属性的字符串值,属性未定义,返回空串。
getPropertyWithDefault:返回指定属性的字符串值,属性未定义,返回提供的缺省值。
getPropertyAsInt:类似getProperty,返回整数,若非有效数值,则返回0。
getPropertyAsIntWithDefault:类似getPropertyAsInt,若非有效数值,则返回缺省值。
getPropertiesForPrefix:返回指定前缀的属性集合,类型为PropertyDict。

// ...
Ice::CommunicatorPtr ic;
// ...
ic = Ice::initialize(argc, argv);
//
Ice::PropertiesPtr props = ic->getProperties();
Ice::Int maxSize
        = props->getPropertyAsIntWithDefault("Filesystem.MaxFileSize",1024);
// ...

3.2、设置属性
setProperty可将属性设置为指定值。由于通讯器在调用Ice:initialize(argc,argv);时就会读取配置文件,之后不再重新读配置。因此本函数应该在初始化之前调用,初始化之后设置属性,在重启应用程序前是不起作用的。

设置属性集:
Ice::PropertiesPtr props = Ice::createProperties(argc, argv);
props->setProperty("Ice.Trace.Network", "0");
props->setProperty("Ice.Trace.Protocol", "0");

// ...
Ice::InitializationData id;
id.properties = props;
Ice::CommunicatorPtr ic = Ice::initialize(id);
// ...


3.3、分析属性
• getCommandLineOptions:  把属性集转换为命令行选项。
• parseCommandLineOptions:把命令行选项转换为属性集。

使用范例:
int main(int argc, char* argv[])
{
    // 创建一个空属性集。
    Ice::PropertiesPtr props = Ice::createProperties();

    // 将argc/argv转换为字符串序列。
    Ice::StringSeq args = Ice::argsToStringSeq(argc, argv);

    //析出所有以 --Filesystem 开始的选项。
    args = props->parseCommandLineOptions("Filesystem", args);

    // args 现在只包含未析出的选项。所有以--Filesystem开头的选项被转换为属性,
    // 存放在props对象中。现在,把剩余的参数转换回arg/argv向量。
    Ice::stringSeqToArgs(args, argc, argv);

    // 初始化通讯器。
    Ice::InitializationData id;
    id.properties = props;
    Ice::CommunicatorPtr ic = Ice::initialize(argc, argv, id);
    // 创建通讯器之后,argc/argv只包括与Ice属性和Filesystem属性无关的选项。
    // ...
}

3.4、实用操作
.clone 创建一份属性集副本。
.load 从指定配置文件中装载属性集。

4、未用属性
Ice.Warn.UnusedProperties 设置为非零。若属性设置但未读过其值,在通讯器销毁时,会发出警告,用于检查拼写负荆请罪。缺省为零,表示禁用。

你可能感兴趣的:(ZeroC,Ice)