【 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 设置为非零。若属性设置但未读过其值,在通讯器销毁时,会发出警告,用于检查拼写负荆请罪。缺省为零,表示禁用。