Ice使用一种配置机制,允许您在运行时控制Ice应用程序行为的许多方面,例如最大消息大小、线程数或是否生成网络跟踪消息。配置机制不仅用于配置Ice,还用于配置自己的应用程序。配置机制使用的API非常简单,但是可以灵活地处理大多数应用程序的需求。
Ice和它的各种子系统是由properties配置的。一个属性(property)是一个键值对,例如:
Ice.UDP.SndSize=65535
配置Ice属性的完整列表:
官方原文
中文翻译
请注意,Ice读取的属性控制了Ice run time和它的服务(也就是说,在启动时,创建一个通信器时,只有第一次启动时才开始使用一个保留前缀的属性值,比如Ice、Glacier2,等等)。这意味着在创建通信器之前,必须将与Ice相关的属性设置为正确的值。如果在那之后改变与Ice相关的属性值,那么新的设置很可能会被忽略。
Ice 属性推荐这样命名:
sub-category是可选的,不是所有的属性都必须。这也仅仅是推荐方案,如果你使用Ice属性来配置自己的应用,可以使用任意层级的属性名称
Ice保留具有以下前缀的属性
Ice
IceBox
IceGrid
IcePatch2
IceSSL
IceStorm
Freeze
Glacier2
你不能使用以这些前缀之一开头的属性来配置自己的应用程序。
属性名称语法
属性名称由任意数量的字符组成。 例如,以下是有效的属性名称:
请注意,属性名称中的句号(.)没有特殊意义。 (句号用于使属性名称更易于阅读,不会被属性解析器特别处理。
属性名称不能包含前导或尾随的空格。 (如果创建一个带有前导或尾随空格的属性名称,则该空白将被静默地剥离。)
属性值语法
属性值也可以由任意数量的字符组成。 例如,以下是有效的属性值:
未使用的属性
在销毁通信器(communicator)时,Ice run time可以选择为已设置但从未读取的属性发出警告。 要启用此警告,请将Ice.Warn.UnusedProperties设置为非零值。 此属性可用于检测错误拼写的属性,例如Filesystem.MaxFilSize。 默认情况下,警告禁用。
配置文件格式
一个配置文件包含任意数量的键值对,每一对在一个单独的行上。 完全由空白字符构成的空行将被忽略。 #字符引入了一个扩展到当前行结尾的注释。 配置文件可以是ASCII文本文件,也可以在文件开头使用UTF?8字符编码与字节顺序标记(BOM)。 这是一个简单的配置文件:
属性键和值中的空白会被保留,无论是用反斜杠转义还是不转义。对于属性名称,始终忽略前导和尾随的空格(无论空格是否被转义),例如:
对于属性值,您可以通过使用反斜杠转义空格来保留前导和尾随空格,例如:
此示例显示,除非用反斜杠转义,否则将忽略属性值的前导和尾随空格,而非空白字符包围的白色空间将被精确保留,无论是否被转义。 像往常一样,您可以使用双反斜杠将字面反斜杠插入属性值。
如果您多次设置相同的属性,则以上一个设置为准,并覆盖任何以前的设置。 请注意,为属性赋值不会清除该属性(即将其设置为空字符串)。
Ice处理包含空字符串的属性(如前面的示例中的Ice.Trace.Protocol),就像一个没有设置的属性,我们建议您的基于Ice的应用程序也是一样的。 使用getProperty,getPropertyAsInt,getPropertyAsIntWithDefault,getPropertyAsList和getPropertyAsListWithDefault,您无法区分未设置的属性和设置为空字符串的属性; 然而,getPropertyWithDefault允许您做出这一区分,例如:
配置文件中的特殊字符
character =和#在配置文件中有特殊含义:
=标记属性名称的结尾和属性值的开头
#开始一条延伸到行尾的注释
这些字符在属性名称中显示时必须进行转义。 请考虑以下示例:
在属性值中,必须转义#字符以防止它发起注释,但是=字符不需要转义。
请注意,属性值中的两个连续反斜杠变为单个反斜杠。 要获得两个连续的反斜杠,您必须使用另一个反斜线来转义每个反斜杠:
除了在配置文件中设置属性之外,还可以在命令行中设置属性,例如:
$ ./server --Ice.UDP.SndSize=65535 --IceSSL.Trace.Security=2
任何命令行选项以 - 并且后面跟着一个保留的前缀进行读取,并在创建通讯器时转换为属性设置。 命令行上的属性设置会覆盖配置文件中的设置。 如果在相同的命令行上多次设置相同的属性,则最后一个设置会覆盖任何先前的设置。
为方便起见,未明确设置为值的任何属性都设置为值1.例如,
$ ./server --Ice.Trace.Protocol
等价于
$ ./server --Ice.Trace.Protocol=1
请注意,此功能仅适用于在命令行上设置的属性,但不适用于从配置文件设置的属性。
你还可以从命令行清除属性,如下所示:
$ ./server --Ice.Trace.Protocol=
对于从配置文件设置的属性,对属性不分配将清除该属性。
外部配置应用程序的属性的能力提供了很大的灵活性:你可以使用命令行选项和配置文件的任意组合来实现所需的设置,而无需修改应用程序。
ICE_CONFIG环境变量
Ice自动加载ICE_CONFIG环境变量中指定的配置文件的内容(假设满足先决条件)。例如:
$ export ICE_CONFIG = / usr / local / filesystem / config $ ./server
这将导致服务器从/ usr / local / filesystem / config中的配置文件读取其属性设置。 如果将ICE_CONFIG环境变量与其他属性的命令行选项一起使用,则命令行上的设置会覆盖配置文件中的设置。例如:
$ export ICE_CONFIG = / usr / local / filesystem / config
$ ./server --Ice.MessageSizeMax = 4096
这将Ice.MessageSizeMax属性的值设置为4096,而不管/ usr / local / filesystem / config中是否具有此属性的任何设置。 您可以通过指定以逗号分隔的配置文件名称列表来使用多个配置文件。例如:
$ export ICE_CONFIG = / usr / local / filesystem / config,。/ config
$ ./server
这会导致从/ usr / local / filesystem / config中检索属性设置,后跟当前目录中的文件config中的任何设置;设置在./config中覆盖设置/ usr / local / filesystem / config。
Ice.Config属性
Ice.Config属性对Ice run time具有特殊的意义:它决定了从中读取属性设置的配置文件的路径名。例如:
$ ./server --Ice.Config = / usr / local / filesystem / config
这将导致从/ usr / local / filesystem / config中的配置文件读取属性设置。
--Ice.Config命令行选项将覆盖ICE_CONFIG环境变量的任何设置,也就是说,如果设置了ICE_CONFIG环境变量,并且还使用了--Ice.Config命令行选项,则由ICE_CONFIG环境变量被忽略。
如果将--Ice.Config命令行选项与其他属性的设置一起使用,则命令行上的设置会覆盖配置文件中的设置。例如:
$ ./server --Ice.Config = / usr / local / filesystem / config
--Ice.MessageSizeMax = 4096
这将Ice.MessageSizeMax属性的值设置为4096,而不管/ usr / local / filesystem / config中是否具有此属性的任何设置。在命令行上放置--Ice.Config选项对此优先级没有影响。例如,以下命令与上述命令相同:
$ ./server --Ice.MessageSizeMax = 4096
--Ice.Config = / usr / local / filesystem / config
配置文件中的Ice.Config属性的设置将被忽略,也就是说,您只能在命令行中设置Ice.Config。
如果多次使用--Ice.Config选项,则仅使用该选项的最后一个设置,并忽略前面的设置。例如:
$ ./server --Ice.Config = file1
--Ice.Config = file2
这相当于使用:
$ ./server --Ice.Config = file2
您可以通过指定以逗号分隔的配置文件名称列表来使用多个配置文件。例如:
$ ./server --Ice.Config = / usr / local / filesystem / config,。/ config
这会导致从/ usr / local / filesystem / config中检索属性设置,后跟当前目录中的文件config中的任何设置;在./config中的设置覆盖/ usr / local / filesystem / config。
Ice属性机制不仅可用于配置Ice,还可以用于自己的应用程序的配置机制。例如,我们可以引入一个属性来控制文件系统应用程序的最大文件大小:
Ice run time存储Filesystem.MaxFileSize属性,就像任何其他属性一样,可以通过Properties界面访问它。
要从程序中访问属性值,您需要通过调用getProperties获取通信器的属性: