Ice使用一種配置機(jī)制,允許您在運(yùn)行時(shí)控制Ice應(yīng)用程序行為的許多方面人芽,例如最大消息大小望几、線程數(shù)或是否生成網(wǎng)絡(luò)跟蹤消息。配置機(jī)制不僅用于配置Ice萤厅,還用于配置自己的應(yīng)用程序橄抹。配置機(jī)制使用的API非常簡(jiǎn)單,但是可以靈活地處理大多數(shù)應(yīng)用程序的需求惕味。
Ice和它的各種子系統(tǒng)是由properties配置的楼誓。一個(gè)屬性(property)是一個(gè)鍵值對(duì),例如:
? ? ? Ice.UDP.SndSize=65535
配置Ice屬性的完整列表:
請(qǐng)注意名挥,Ice讀取的屬性控制了Ice run time和它的服務(wù)(也就是說疟羹,在啟動(dòng)時(shí),創(chuàng)建一個(gè)通信器時(shí)禀倔,只有第一次啟動(dòng)時(shí)才開始使用一個(gè)保留前綴的屬性值榄融,比如Ice、Glacier2救湖,等等)剃袍。這意味著在創(chuàng)建通信器之前,必須將與Ice相關(guān)的屬性設(shè)置為正確的值捎谨。如果在那之后改變與Ice相關(guān)的屬性值民效,那么新的設(shè)置很可能會(huì)被忽略憔维。
Ice 屬性推薦這樣命名:
sub-category是可選的,不是所有的屬性都必須畏邢。這也僅僅是推薦方案业扒,如果你使用Ice屬性來配置自己的應(yīng)用,可以使用任意層級(jí)的屬性名稱
Ice保留具有以下前綴的屬性
Ice
IceBox
IceGrid
IcePatch2
IceSSL
IceStorm
Freeze
Glacier2
你不能使用以這些前綴之一開頭的屬性來配置自己的應(yīng)用程序舒萎。
屬性名稱語法
屬性名稱由任意數(shù)量的字符組成程储。 例如,以下是有效的屬性名稱:
請(qǐng)注意臂寝,屬性名稱中的句號(hào)(.)沒有特殊意義章鲤。 (句號(hào)用于使屬性名稱更易于閱讀,不會(huì)被屬性解析器特別處理咆贬。
屬性名稱不能包含前導(dǎo)或尾隨的空格败徊。 (如果創(chuàng)建一個(gè)帶有前導(dǎo)或尾隨空格的屬性名稱,則該空白將被靜默地剝離掏缎。)
屬性值語法
屬性值也可以由任意數(shù)量的字符組成皱蹦。 例如,以下是有效的屬性值:
未使用的屬性
在銷毀通信器(communicator)時(shí)眷蜈,Ice run time可以選擇為已設(shè)置但從未讀取的屬性發(fā)出警告沪哺。 要啟用此警告,請(qǐng)將Ice.Warn.UnusedProperties設(shè)置為非零值酌儒。 此屬性可用于檢測(cè)錯(cuò)誤拼寫的屬性辜妓,例如Filesystem.MaxFilSize。 默認(rèn)情況下忌怎,警告禁用籍滴。
配置文件格式
一個(gè)配置文件包含任意數(shù)量的鍵值對(duì),每一對(duì)在一個(gè)單獨(dú)的行上呆躲。 完全由空白字符構(gòu)成的空行將被忽略刽漂。 #字符引入了一個(gè)擴(kuò)展到當(dāng)前行結(jié)尾的注釋该溯。 配置文件可以是ASCII文本文件,也可以在文件開頭使用UTF?8字符編碼與字節(jié)順序標(biāo)記(BOM)陶舞。 這是一個(gè)簡(jiǎn)單的配置文件:
屬性鍵和值中的空白會(huì)被保留翁巍,無論是用反斜杠轉(zhuǎn)義還是不轉(zhuǎn)義狡忙。對(duì)于屬性名稱祟绊,始終忽略前導(dǎo)和尾隨的空格(無論空格是否被轉(zhuǎn)義),例如:
對(duì)于屬性值璃弄,您可以通過使用反斜杠轉(zhuǎn)義空格來保留前導(dǎo)和尾隨空格要销,例如:
此示例顯示,除非用反斜杠轉(zhuǎn)義夏块,否則將忽略屬性值的前導(dǎo)和尾隨空格疏咐,而非空白字符包圍的白色空間將被精確保留纤掸,無論是否被轉(zhuǎn)義。 像往常一樣浑塞,您可以使用雙反斜杠將字面反斜杠插入屬性值借跪。
如果您多次設(shè)置相同的屬性,則以上一個(gè)設(shè)置為準(zhǔn)酌壕,并覆蓋任何以前的設(shè)置掏愁。 請(qǐng)注意,為屬性賦值不會(huì)清除該屬性(即將其設(shè)置為空字符串)卵牍。
Ice處理包含空字符串的屬性(如前面的示例中的Ice.Trace.Protocol)果港,就像一個(gè)沒有設(shè)置的屬性,我們建議您的基于Ice的應(yīng)用程序也是一樣的糊昙。 使用getProperty辛掠,getPropertyAsInt,getPropertyAsIntWithDefault溅蛉,getPropertyAsList和getPropertyAsListWithDefault公浪,您無法區(qū)分未設(shè)置的屬性和設(shè)置為空字符串的屬性; 然而他宛,getPropertyWithDefault允許您做出這一區(qū)分船侧,例如:
配置文件中的特殊字符
character =和#在配置文件中有特殊含義:
=標(biāo)記屬性名稱的結(jié)尾和屬性值的開頭
#開始一條延伸到行尾的注釋
這些字符在屬性名稱中顯示時(shí)必須進(jìn)行轉(zhuǎn)義。 請(qǐng)考慮以下示例:
在屬性值中厅各,必須轉(zhuǎn)義#字符以防止它發(fā)起注釋镜撩,但是=字符不需要轉(zhuǎn)義。
請(qǐng)注意队塘,屬性值中的兩個(gè)連續(xù)反斜杠變?yōu)閱蝹€(gè)反斜杠袁梗。 要獲得兩個(gè)連續(xù)的反斜杠,您必須使用另一個(gè)反斜線來轉(zhuǎn)義每個(gè)反斜杠:
除了在配置文件中設(shè)置屬性之外憔古,還可以在命令行中設(shè)置屬性遮怜,例如:
? ? ? ? ? $ ./server --Ice.UDP.SndSize=65535 --IceSSL.Trace.Security=2
任何命令行選項(xiàng)以 - 并且后面跟著一個(gè)保留的前綴進(jìn)行讀取,并在創(chuàng)建通訊器時(shí)轉(zhuǎn)換為屬性設(shè)置鸿市。 命令行上的屬性設(shè)置會(huì)覆蓋配置文件中的設(shè)置锯梁。 如果在相同的命令行上多次設(shè)置相同的屬性,則最后一個(gè)設(shè)置會(huì)覆蓋任何先前的設(shè)置焰情。
為方便起見陌凳,未明確設(shè)置為值的任何屬性都設(shè)置為值1.例如,
? ? ? ? ? ?$ ./server --Ice.Trace.Protocol
等價(jià)于
? ? ? ? ?$ ./server --Ice.Trace.Protocol=1
請(qǐng)注意内舟,此功能僅適用于在命令行上設(shè)置的屬性合敦,但不適用于從配置文件設(shè)置的屬性。
你還可以從命令行清除屬性验游,如下所示:
$ ./server --Ice.Trace.Protocol=
對(duì)于從配置文件設(shè)置的屬性充岛,對(duì)屬性不分配將清除該屬性保檐。
外部配置應(yīng)用程序的屬性的能力提供了很大的靈活性:你可以使用命令行選項(xiàng)和配置文件的任意組合來實(shí)現(xiàn)所需的設(shè)置,而無需修改應(yīng)用程序崔梗。
ICE_CONFIG環(huán)境變量?
Ice自動(dòng)加載ICE_CONFIG環(huán)境變量中指定的配置文件的內(nèi)容(假設(shè)滿足先決條件)展东。例如:?
? ? $ export ICE_CONFIG = / usr / local / filesystem / config $ ./server?
這將導(dǎo)致服務(wù)器從/ usr / local / filesystem / config中的配置文件讀取其屬性設(shè)置。 如果將ICE_CONFIG環(huán)境變量與其他屬性的命令行選項(xiàng)一起使用炒俱,則命令行上的設(shè)置會(huì)覆蓋配置文件中的設(shè)置盐肃。例如:
? ? $ export ICE_CONFIG = / usr / local / filesystem / config?
? ? $ ./server --Ice.MessageSizeMax = 4096?
這將Ice.MessageSizeMax屬性的值設(shè)置為4096,而不管/ usr / local / filesystem / config中是否具有此屬性的任何設(shè)置权悟。 您可以通過指定以逗號(hào)分隔的配置文件名稱列表來使用多個(gè)配置文件砸王。例如:?
? ? ? ?$ export ICE_CONFIG = / usr / local / filesystem / config,峦阁。/ config?
? ? ? ?$ ./server?
這會(huì)導(dǎo)致從/ usr / local / filesystem / config中檢索屬性設(shè)置谦铃,后跟當(dāng)前目錄中的文件config中的任何設(shè)置;設(shè)置在./config中覆蓋設(shè)置/ usr / local / filesystem / config。
Ice.Config屬性
Ice.Config屬性對(duì)Ice run time具有特殊的意義:它決定了從中讀取屬性設(shè)置的配置文件的路徑名榔昔。例如:
? ? ? ? ? ? ? ? $ ./server --Ice.Config = / usr / local / filesystem / config
這將導(dǎo)致從/ usr / local / filesystem / config中的配置文件讀取屬性設(shè)置驹闰。
--Ice.Config命令行選項(xiàng)將覆蓋ICE_CONFIG環(huán)境變量的任何設(shè)置,也就是說撒会,如果設(shè)置了ICE_CONFIG環(huán)境變量嘹朗,并且還使用了--Ice.Config命令行選項(xiàng),則由ICE_CONFIG環(huán)境變量被忽略诵肛。
如果將--Ice.Config命令行選項(xiàng)與其他屬性的設(shè)置一起使用屹培,則命令行上的設(shè)置會(huì)覆蓋配置文件中的設(shè)置。例如:
? ? ? ? ? ? ? ? $ ./server --Ice.Config = / usr / local / filesystem / config?
? ? ? ? ? ? ? ? ?--Ice.MessageSizeMax = 4096
這將Ice.MessageSizeMax屬性的值設(shè)置為4096怔檩,而不管/ usr / local / filesystem / config中是否具有此屬性的任何設(shè)置褪秀。在命令行上放置--Ice.Config選項(xiàng)對(duì)此優(yōu)先級(jí)沒有影響。例如薛训,以下命令與上述命令相同:
? ? ? ? ? ? ? $ ./server --Ice.MessageSizeMax = 4096?
? ? ? ? ? ? ? ?--Ice.Config = / usr / local / filesystem / config
配置文件中的Ice.Config屬性的設(shè)置將被忽略媒吗,也就是說,您只能在命令行中設(shè)置Ice.Config乙埃。
如果多次使用--Ice.Config選項(xiàng)闸英,則僅使用該選項(xiàng)的最后一個(gè)設(shè)置,并忽略前面的設(shè)置膊爪。例如:
? ? ? ? ? ? ? ?$ ./server --Ice.Config = file1?
? ? ? ? ? ? ? ?--Ice.Config = file2
這相當(dāng)于使用:
? ? ? ? ? ? ? ? $ ./server --Ice.Config = file2
您可以通過指定以逗號(hào)分隔的配置文件名稱列表來使用多個(gè)配置文件自阱。例如:
? ? ? ? ? ? ? $ ./server --Ice.Config = / usr / local / filesystem / config,米酬。/ config
這會(huì)導(dǎo)致從/ usr / local / filesystem / config中檢索屬性設(shè)置沛豌,后跟當(dāng)前目錄中的文件config中的任何設(shè)置;在./config中的設(shè)置覆蓋/ usr / local / filesystem / config。
Ice屬性機(jī)制不僅可用于配置Ice,還可以用于自己的應(yīng)用程序的配置機(jī)制。例如加派,我們可以引入一個(gè)屬性來控制文件系統(tǒng)應(yīng)用程序的最大文件大薪腥贰:
Ice run time存儲(chǔ)Filesystem.MaxFileSize屬性,就像任何其他屬性一樣芍锦,可以通過Properties界面訪問它竹勉。
要從程序中訪問屬性值,您需要通過調(diào)用getProperties獲取通信器的屬性: