`

ICE 属性配置相关

    博客分类:
  • ICE
 
阅读更多
在前一篇文章中,大家可能都注意到了一个细节,Ice的初始化函数initialize的输入参数正好是主函数的输入参数,也就是命令行参数(注:辅助类Ice::Application也调用了initialize函数)。
Ice的初始化函数得到命令行参数后,抽取出Ice专有参数,并把分析后的配置存入到Ice的属性表中。
假设命令行为:
MyProg.exe --myoption --Ice.Config=config\
     -x a --Ice.Trace.Network=3 -y opt file
其中MyProg.exe是我们用Ice编写的程序,当Ice::initialize返回时,Ice的两个专用参数就会被抽去,argc由原来的9变成7,argv为:
MyProg.exe
--myoption
-x
a
-y
opt
file
抽去的两个参数则存放于属性表里。属性表的类型为Ice::Properties,它的常用方法有:
std::string getProperty(const std::string& prop);
std::string getPropertyWithDefault(const std::string& prop, const std::string&);
Ice::Int getPropertyAsInt(const std::string& prop);
Ice::Int getPropertyAsIntWithDefault(const std::string& prop, Ice::Int);
取得prop属性的值

Ice::StringSeq getPropertyAsList(const ::std::string& prop);
Ice::StringSeq getPropertyAsListWithDefault(const ::std::string& prop, const ::Ice::StringSeq&);
取得prop属性的值,并返回按逗号分割成的一组值。这里的Ice::StringSeq就是std::vector<std::string>(注:集合类型可通过配置改变,默认是vector)。
比如:有命令行参数: --MyProp.Test=abc,def,aaa,sde,s 则返回
abc
def
aaa
sde
s

Ice::PropertyDict getPropertiesForPrefix(const ::std::string& prefix);
返回所有含有prefix前缀的所有属性,PropertyDict是一个std::map<std::string, std::string>类型的数据表。

void setProperty(const ::std::string& prop, const ::std::string&);
设置prop属性的值

Ice::StringSeq getCommandLineOptions();
把属性表中的所有数据转化成字符串列表

Ice::StringSeq parseCommandLineOptions(
    const std::string& prefix, const Ice::StringSeq& args);
分析命令行参数,抽取出所有prefix前缀的参数,返回剩余的命令行参数。由于main函数输入的是argc和argv,我们可以使用Ice::StringSeq argsToStringSeq(int, char*[])和void stringSeqToArgs(const StringSeq&, int&, char*[])函数在StringSeq与argc/argv之间互相转换。

Ice::StringSeq parseIceCommandLineOptions(const Ice::StringSeq&);
分析Ice专有命令行参数

void load(const std::string& file);
载入file指定的配置文件,关于配置文件后文还会讲到

Ice::PropertiesPtr clone()
返回一个属性表的拷贝
下面是获得属性表的两个常用方式:
Ice::PropertiesPtr createProperties();
生成一个全新的属性表

Ice::PropertiesPtr Ice::Communicator::getProperties();
从连接器中取得当前使用的属性表
利用属性表改进我们的程序
比如,我们前面的客户端的例子:
class MyApp: public Ice::Application{
public:
    virtual int run(int, char*[])
    {
        Ice::CommunicatorPtr ic = communicator();
        Ice::ObjectPrx base =
            ic->stringToProxy("SimplePrinter:default -p 10000");
        PrinterPrx printer =  PrinterPrx::checkedCast(base);
        if(!printer) throw "Invalid Proxy!";
        printer->printString("Hello World!");
        return 0;
    }
};
ic->stringToProxy("SimplePrinter:default -p 10000");这句把代理名、协议、端口以及主机名都固化在了程序中。有时,我们需要更大的灵活性,比如由命令行参数或配置文件指定它们,上面提到的Properties接口就可以帮我们:
class MyApp: public Ice::Application{
public:
    virtual int run(int, char*[])
    {
        Ice::CommunicatorPtr ic = communicator();
        Ice::PropertiesPtr prop = ic->getProperties();
        string s = prop->getPropertyWithDefault(
            "Ice.Printer","SimplePrinter:default -p 10000");
        Ice::ObjectPrx base = ic->stringToProxy(s);
        PrinterPrx printer =  PrinterPrx::checkedCast(base);
        if(!printer) throw "Invalid Proxy!";
        printer->printString("Hello World!");
        return 0;
    }
};
这里,代理字符串从属性表(Ice::Properties,Ice::PropertiesPtr是Ice::Properties的智能指针)中得到,我们只要改变命令行参数就可以改变这个字符串,如:
MyProg.exe --Ice.Printer="SimplePrinter:tcp -p 10000"
MyProg.exe --Ice.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5"
...
可能你已经猜到,如果命令行里没有指定Ice.Printer,则使用默认的"SimplePrinter:default -p 10000"
另外,上面的:
Ice::PropertiesPtr prop = ic->getProperties();
string s = prop->getPropertyWithDefault(
    "Ice.Printer","SimplePrinter:default -p 10000");
Ice::ObjectPrx base = ic->stringToProxy(s);
三条指令可以用一条指令代替:
Ice::ObjectPrx base = ic->propertyToProxy("Ice.Printer");
多写几行有时还是有用的,我们可以利用它来读取我们自定义的一些参数^_^(当然还有默认参数功能)
上面的命令行里我们取的是"Ice.Printer"属性,注意它的前缀是"Ice.",如果我们改成其它前缀,如"MyProp.",那么Ice初始化时就不认为这是Ice专用参数而不理睬它了。
我们想自定义一些属性用于“私用”的话,使用"Ice."前缀就显得不合理了,这时我们可以使用属性集的parseCommandLineOptions方法来解析指定前缀的参数:
class MyApp: public Ice::Application{
public:
    virtual int run(int argc, char*argv[])
    {
        Ice::CommunicatorPtr ic = communicator();
        Ice::PropertiesPtr prop = Ice::createProperties();
        prop->parseCommandLineOptions("MyProp",
            Ice::argsToStringSeq(argc,argv));
        string s = prop->getPropertyWithDefault(
            "MyProp.Printer","SimplePrinter:default -p 10000");
        Ice::ObjectPrx base = ic->stringToProxy(s);
        PrinterPrx printer =  PrinterPrx::checkedCast(base);
        if(!printer) throw "Invalid Proxy!";
        printer->printString("Hello World!");
        return 0;
    }
};
现在,程序可以解析MyProp.Printer属性了。
配置文件
对于少量的属性,使用命令行参数确实没什么问题,一旦自定义属性增加,使用命令行参数就显得不太合适了。
Ice允许我们把所有的属性参数写到一个文本文件里,每个参数一行,比如有:
MyProg.exe \
    --MyProp.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5" \
    --MyProp.Test="abc,def,aaa,sde,s"
我们可以生成一个文本文件,内容:
MyProp.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5"
MyProp.Test="abc,def,aaa,sde,s"
然后,把上面的命令行参数改成:
MyProg.exe --Ice.Config=文件名
或者使用Ice::Properties::load方法载入文件,
或者使用Ice::Properties::parseIceCommandLineOptions方法解析文本内容。
分享到:
评论

相关推荐

    Ice 分布式程序设计

    第 14 章 Ice 属性与配置 第 15 章 C++ 线程与并发 第 16 章 Ice Run Time 详解 第 17 章 异步程序设计 第 18 章 Ice 协议 第 19 章 Ice 的 PHP 扩展 第 20 章 IcePack 第 21 章 Freeze 第 23 章 IceSSL 第 24 章...

    ICE分布式程序设计中文版

    第 14 章 Ice 属性与配置 307 14.1 本章综 307 14.2 属性 307 14.3 配置文件 309 14.4 在命令行上设置属性 309 14.5 Ice.Config 属性 310 14.6 命令行解析与初始化 311 14.7 Ice.ProgramName 属性 312 14.8 在程序中...

    PADS9.0新功能

    HCR 设置 新的 Tuning 参数 支持输出 IPC-D-356 格式网络表 支持 Flat DXF 格式输出 支持圆角和斜角的焊盘形状 单面板的 DRC 校验 Automation 3D 浏览器 支持制造流程 visECAD CAMCAD Professional ...

    Pligg内容管理系统简体中文版1.0

    3. 将以下文件夹属性设置为777 /avatars/user_uploaded /backup /cache /images /templates /templates_c 如果777设置失败,可以尝试775 4. 将以下文件夹属性设置为666 /libs/dbconnect.php /libs/...

    remixer:轻巧的可配置JavaScript库,可让您混合显示当前播放的歌曲

    混音器 Remixer是一个轻量级的,可配置JavaScript库,可让您以混音形式显示当前播放的歌曲。 默认值 Remixer将使用以下默认值。 所有值都可以覆盖(请参阅配置)。... "artist": "Ice Cube", "timest

    WebRTetris:使用 WebRTC-DataChannel API 的网络播放“俄罗斯方块”

    WebRTetris 使用 WebRTC-DataChannel API 的网络播放“俄罗斯方块” 如何构建 ... 请打开您的编辑器并更改以下属性: // ICE(STUN Server) config.ICE_SERVER = {'iceServers': [{'url': 'stun:s

    issuesSets::label::ice_cream: 包含JS、HTML、CSS常见面试题集锦,每天进步亿点点

    为列表渲染设置key属性的原因 Vue中的事件机制$on/$off/$once/$emit:candy: v-show和v-if指令的区别 v-if和v-for指令为什么不建议同时使用 Vue组件化——全局组件和局部组件 Vue组件间数据传递 Vue的内置全局组件 ...

    一个微型、可定制和高度可扩展的 MCU 级 32 位 RISC-V 软核 CPU 和类似微控制器的 SoC

    该项目旨在作为大型 SoC 设计中的辅助处理器,或作为现成的独立定制微控制器,甚至可以安装到运行频率为 +24 MHz 的 Lattice iCE40 UltraPlus 5k 低功耗和低密度 FPGA 中。 特别关注执行安全,以随时提供定义和可...

    McAfee 8.0 简体中文

    略在每个扫描程序属性页中是启用的。 - 其次,逐一配置每个扫描程序(按访问扫描程序、按需扫描程序和电 子邮件扫描程序),并指定在检测到有害程序时扫描程序要执行的操 作。在此处指定的操作与其他扫描...

    ASP.NET Core 3框架揭秘之 异步线程无法使用IServiceProvider问题

    如下面的代码片段所示,除了注册与ASP.NET Core MVC框架相关的服务与中间件之外,我们还调用了IHostBuilder的UseDefaultServiceProvider方法将配置选项ServiceProviderOptions的ValidateScopes属性设置为True,以...

    卸载ZkeysPHP 后iis网站出现Service Unavailable 解决办法

    ZkeysPHP确实不错,使用比较简单,很方便新手使用,使用以后建议再找专业的安全设置团队给设置下比较好,windows下本了漏洞就多,80%的网站有后门的情况来看,就算手工配置不安全设置也会出现问题。解决办法: 1、...

    关于Laravel Service Provider开发设置延迟加载时遇到的问题详解

    本文主要介绍了关于Laravel Service Provider设置延迟加载时遇到的一些问题,之所有这篇文章,是因实际项目需求,近日在开发 laravel-database-logger 包的时候,发现设置 ServiceProvider defer 属性设置为 true 时...

    libsolarus-mudora:一个Solarus Lua库,用于存放常见的游戏实体和其他物品

    当前实现了以下实体:箭头-&gt; Builtin / arrow.lua滑冰-&gt;其他/slip_ice.lua 2.1箭 箭头具有max_dist,速度和角度属性。 可以使用setter和getter函数设置或返回它们。 定义的唯一事件是on_update(),它将移动箭头。 ...

    uboott移植实验手册及技术文档

    (2)修改时钟设置(这个文件要根据具体的平台进行修改) (3)将从Nor Flash启动改成从 NAND Flash启动 在文件中找到 195-201 代码,并在 201行后面添加如下代码: 195 copy_loop: 196 ldmia r0!, {r3-r10} /* ...

    Web Slices是什么

    IE8新功能Web Slices(网页快讯) 微软3月20日发布IE8正式版,新功能Web Slices...点击右键选择属性设置更新计划,当有更新时它会以加粗的方式通知你,或者手动刷新查看。 如何制作Web Slices? Web Slices采用了Microfo

    Andoird Nice Spinner源码解析

    在这个项目基础上扩展了一些属性, 扩展后项目 源码中比较有意思的部分是如何将上一次选中的数据在下一次展示下拉框时排除该条数据 初始化ListPopupWindow 时, 设置ListPopupWindow点击条目事件的回调方法, 在这里...

    异步调用webservice返回responseXML为空的问题解决方法

    3)xml加载后异步属性设置; 4)命名空间处理等问题; 下面上代码: ========ASPX前台代码======== 代码如下: &lt;&#37;@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default.aspx.cs

    Mono for Android 实现高效的导航(Effective Navigation)

    打开 MonoDevelop , 新建一个 Mono for Android 项目, 并在项目的属性页将 Target Framework 设置为 Android 4.0.3 (Ice Cream Sandwich) , 如下图所示: 添加 Mono.Android.Support.v4 引用项

    Java轻量级IOC框架Guice

     无外部配置(如需要使用外部可以可以选用Guice的扩展包),完全基于annotation特性,支持重构,代码静态检查。  简单,快速,基本没有学习成本。  Guice和spring各有所长,Guice更适合与嵌入式或者高性能但项目...

Global site tag (gtag.js) - Google Analytics