TAO教程之七:异步方法调用——针对急迫的( impatient )客户端的CORBA解决方案
异步方法调用——针对急迫的( impatient )客户端的CORBA解决方案
我们的简单服务详细阐述了如何通过传统CORBA同步方向调用来查询股票的价格的。假定,举例来说,一个复杂的市场分析工具的初始化时,我们必须对数百支股票进行价格查询。在这种情况下按顺序发送请求会严重影响性能;由于在发送后一条查询请求之前我们需要等待上一条查询的返回,所以我们不能利用分布式的系统本身的并行性。针对这个问题传统的解决方法是使用oneway调用或者使用多线程。这两种方式都是可行的,但都有缺点:多线程编程非常困难并且容易出错,oneway不可靠并且需要回调接口返回股票的值。最近,OMG核准了CORBA Messaging规范来扩展基本的调用模型以支持异步调用。这以之前的同步调用模型不同,新的模型使用IDL编译器和SII来达到类型安全和提高的性能,并且应用程序不会在等待影响时阻塞。该模型提供的ORB的一个引用来返回处理器,这个处理器将异步的接收响应。该规范还定义了投递(polling)接口,由于TAO未实现此接口,所以这里不作讨论。
为了解决上面的问题我们扩展IDL接口来包含新的操作:
interface Single_Query_Stock : Stock { double get_price_and_names (out string symbol, out string full_name); };
这将使一些示例得以简化。
第一步是生成支持回调AMI的stubs和skeletions。我们使用-GC标记:
$ $ACE_ROOT/TAO/TAO_IDL/tao_idl -GC Quoter.idl
您或许想简单的查看生成的客户端的接口。IDL编译器添加新的方法到 Quoter::Stock
接口。请特别注意下面的方法:
virtual void sendc_get_price_and_names ( AMI_Single_Query_StockHandler_ptr ami_handler );
这就是用于发送异步请求的操作。处理器对象用于接收响应。下面是一个正规的CORBA对象,此对象带有下面的IDL接口:
interface AMI_Single_Query_StockHandler { void get_price_and_names (in double ami_return_val, in string symbol, in string full_name); };
你无须编写IDL接口。该接口由IDL编译器自动从原始的IDL中生成,所以也称它为隐式IDL。请注意参数是如何生成的,第一个参数是简单的返回值,后面是输出参数,由于处理器必须接收返回,所以设为input。
实现返回处理器
我们必须为新的IDL接口实现伺服代码(servant),以便于我们可以接收到返回值,这正如我们的服务端:
class Single_Query_Stock_Handler_i : public POA_Quoter::AMI_Single_Query_StockHandler { public: Single_Query_Stock_Handler_i (int *response_count) : response_count_ (response_count) {} void get_price_and_names (CORBA::Double ami_return_val, const char *symbol, const char *full_name) { std::cout << "The price of one stock in /"" << full_name << "/" (" << symbol << ") is " << ami_return_val << std::endl; *this->response_count_++; } private: int *response_count_; };
response_count_
字段用来当所有的应答都收到之后中止客户端。
发送异步方向调用
和其它CORBA对象一样激活处理器伺服器(servant):
int response_count = 0; Single_Query_Stock_Handler_i handler_i (&response_count); Quoter::AMI_Single_Query_StockHandler_var handler = handler_i._this ();
然后我们修改循环用来立即发送所有的请求:
int request_count = 0; for (int i = 2; i != argc; ++i) { try { // Get the stock object Quoter::Stock_var tmp = factory->get_stock (argv[i]); Quoter::Single_Query_Stock_var stock = Quoter::Single_Query_Stock::_narrow (tmp.in ()); stock->sendc_get_price_and_names (handler.in ()); request_count++; }
在循环结束后我们一直等待,直到收回所有的响应:
while (response_count < request_count && orb->work_pending ()) { orb->perform_work (); }
练习1
完成client.cpp
文件。这个客户端是否扮演服务端的角色?如果不是,该角色涉及到处理器伺服的什么?如果您认为这也是服务端,那么关于POA您做了些什么?
您可以使用下面的文件完成您的实现:Quoter.idl, Handler_i.h, Handler_i.cpp. 记住简单客户端的主函数(here))是一个不错的开端。
解决方案
查看 client.cpp 文件。这与您的应该不会有太大的差异。
测试
在基于在介绍一节简单服务端之上提供了简单服务器。和以前一样,您需要下面的文件 Stock_i.h, Stock_i.cpp, Stock_Factory_i.h Stock_Factory_i.cpp 和server.cpp.
配置
迄今为止我们在TAO中使用的是默认的配置,但是通过好的调整能让AMI可以工作得更好。例如,默认的TAO为每个显示的请求使用单独的连接。这对于同步方向调用(SMI)来说是一个好的策略,因为用单独的线程发送并发的请求不需要用到共享的资源,但这个方法对于异步方法调用(AMI)来说缺少可伸缩性,这是因为它需要创建过多的连接。本解决方案改变策略用于使连接可被共享。为了达到这个目的,我们需要创建一个下面内容的svc.conf文件:
static Client_Strategy_Factory "-ORBTransportMuxStrategy MUXED"
还有许多其它的配置选项,这些都描述在文档 Options.html,configurations.html 和来自OCI的开发者指南中。
TAO教程之七:异步方法调用——针对急迫的( impatient )客户端的CORBA解决方案相关推荐
- 【OpenCV入门教程之七】 玩转OpenCV源代码:生成OpenCV工程解决方案与OpenCV源码编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/21974023 作者:毛星云(浅墨) ...
- win10无法登录(调用的对象已与其客户端断开连接)
win10无法登录--调用的对象已与其客户端断开连接 问题描述 解决方案 问题描述 启动电脑,进入登录界面,输入密码,无法进入系统,显示:调用的对象已与其客户端断开连接 解决方案 1.点击 重启电脑. ...
- SAP UI5 初学者教程之七 - JSON 模型初探试读版
Jerry 从 2014 年加入 SAP成都研究院 CRM Fiori 开发团队之后开始接触 SAP UI5,曾经在 SAP 社区和"汪子熙"微信公众号上发表过多篇关于 SAP U ...
- C#异步方法调用(四大方法详解)
计算机中有些处理比较耗时.调用这种处理代码时,调用方如果站在那里苦苦等待,会严重影响程序性能.例如,某个程序启动后如果需要打开文件读出其中的数据,再根据这些数据进行一系列初始化处理,程序主窗口将迟迟不 ...
- SAP UI5 应用开发教程之七十九 - 采用测试驱动开发理念(Test Driven Development)进行 SAP UI5 应用的功能开发(一)的试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- MySQL数据库教程之七:MySQL编程基础
MySQL数据库教程之七:MySQL编程基础 准备工作: 先启动MySQL,并打开前期建立的数据库和表 查看每个表的结构: 一.MySQL常量的基本编程 按照MySQL的数据类型划分,可以划分为:数值 ...
- 【Visual C++】游戏开发笔记三十九 浅墨DirectX教程之七 他山之石:几种几何体的快捷绘制法
本篇文章里,我们对Direct3D之中几种几何体的简洁绘制方法进行了详细的剖析,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载.(这标题有些歧义的,这个几种是修饰 ...
- SAP UI5 应用开发教程之七十七 - SAP UI5 动态页面路由的高级用法:路由记录 routes 和 target 的一对多关系试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- wcf简单教程(10) ajax调用,wcf简单教程(10) ajax调用
wcf简单教程(10) ajax调用 [2021-02-11 16:23:59] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(&q ...
最新文章
- 前端之Bootstrap框架
- KVM-Qemu-Libvirt三者之间的关系
- 自定义requestAnimationFrame帧频
- C99 calloc、malloc和realloc区别
- SkipList和java中ConcurrentSkipListMap的实现
- jzoj3188-找数【质数筛,数论】
- 属性值动态调整_这可能是你见过最牛的CAD粗糙度动态块了!
- C# UdpClient使用Receive和BeginReceive接收消息时的不同写法
- 手写邮箱获取验证码注册登录功能
- java-字符串反转
- queue的常见用法
- PTA:6-8 数组元素的区间删除 (20 分)
- PCalc for Mac(科学计算器)
- tomcat7.0设置多域名指向同IP不同项目
- [C#]巧妙获取正在使用的IPv4地址
- Day03 车牌识别
- 15.3,python中扫描条形码和二维码
- 美丽的日本与我(川端康成在诺贝尔文学奖颁奖典礼上的演讲词)
- 使用键盘发布手柄控制信息
- java心电图_使用原生js+canvas实现模拟心电图
热门文章
- C# 常量、变量介绍
- android自带语音识别,Android如何实现自带谷歌语音识别垃圾分类APP
- 资深技术官聊聊Java程序员三年这个“梗”,该如何突破自身瓶颈?
- python思考题实验题整理
- PT100分度表分享
- Assignment outside of section 报错是什么意思?
- openjudge 1.7.6 合法C标识符
- ViT-B参数量计算
- 正在此计算机上搜索更新,解决:已在此计算机上检测到Microsoft Visual C++ 2010 Redistributable的更新版本...
- 在线网页视频播放器(flash flv播放器)