异步方法调用——针对急迫的( 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解决方案相关推荐

  1. 【OpenCV入门教程之七】 玩转OpenCV源代码:生成OpenCV工程解决方案与OpenCV源码编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/21974023 作者:毛星云(浅墨) ...

  2. win10无法登录(调用的对象已与其客户端断开连接)

    win10无法登录--调用的对象已与其客户端断开连接 问题描述 解决方案 问题描述 启动电脑,进入登录界面,输入密码,无法进入系统,显示:调用的对象已与其客户端断开连接 解决方案 1.点击 重启电脑. ...

  3. SAP UI5 初学者教程之七 - JSON 模型初探试读版

    Jerry 从 2014 年加入 SAP成都研究院 CRM Fiori 开发团队之后开始接触 SAP UI5,曾经在 SAP 社区和"汪子熙"微信公众号上发表过多篇关于 SAP U ...

  4. C#异步方法调用(四大方法详解)

    计算机中有些处理比较耗时.调用这种处理代码时,调用方如果站在那里苦苦等待,会严重影响程序性能.例如,某个程序启动后如果需要打开文件读出其中的数据,再根据这些数据进行一系列初始化处理,程序主窗口将迟迟不 ...

  5. SAP UI5 应用开发教程之七十九 - 采用测试驱动开发理念(Test Driven Development)进行 SAP UI5 应用的功能开发(一)的试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  6. MySQL数据库教程之七:MySQL编程基础

    MySQL数据库教程之七:MySQL编程基础 准备工作: 先启动MySQL,并打开前期建立的数据库和表 查看每个表的结构: 一.MySQL常量的基本编程 按照MySQL的数据类型划分,可以划分为:数值 ...

  7. 【Visual C++】游戏开发笔记三十九 浅墨DirectX教程之七 他山之石:几种几何体的快捷绘制法

    本篇文章里,我们对Direct3D之中几种几何体的简洁绘制方法进行了详细的剖析,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载.(这标题有些歧义的,这个几种是修饰 ...

  8. SAP UI5 应用开发教程之七十七 - SAP UI5 动态页面路由的高级用法:路由记录 routes 和 target 的一对多关系试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  9. wcf简单教程(10) ajax调用,wcf简单教程(10) ajax调用

    wcf简单教程(10) ajax调用 [2021-02-11 16:23:59]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(&q ...

最新文章

  1. 前端之Bootstrap框架
  2. KVM-Qemu-Libvirt三者之间的关系
  3. 自定义requestAnimationFrame帧频
  4. C99 calloc、malloc和realloc区别
  5. SkipList和java中ConcurrentSkipListMap的实现
  6. jzoj3188-找数【质数筛,数论】
  7. 属性值动态调整_这可能是你见过最牛的CAD粗糙度动态块了!
  8. C# UdpClient使用Receive和BeginReceive接收消息时的不同写法
  9. 手写邮箱获取验证码注册登录功能
  10. java-字符串反转
  11. queue的常见用法
  12. PTA:6-8 数组元素的区间删除 (20 分)
  13. PCalc for Mac(科学计算器)
  14. tomcat7.0设置多域名指向同IP不同项目
  15. [C#]巧妙获取正在使用的IPv4地址
  16. Day03 车牌识别
  17. 15.3,python中扫描条形码和二维码
  18. 美丽的日本与我(川端康成在诺贝尔文学奖颁奖典礼上的演讲词)
  19. 使用键盘发布手柄控制信息
  20. java心电图_使用原生js+canvas实现模拟心电图

热门文章

  1. C# 常量、变量介绍
  2. android自带语音识别,Android如何实现自带谷歌语音识别垃圾分类APP
  3. 资深技术官聊聊Java程序员三年这个“梗”,该如何突破自身瓶颈?
  4. python思考题实验题整理
  5. PT100分度表分享
  6. Assignment outside of section 报错是什么意思?
  7. openjudge 1.7.6 合法C标识符
  8. ViT-B参数量计算
  9. 正在此计算机上搜索更新,解决:已在此计算机上检测到Microsoft Visual C++ 2010 Redistributable的更新版本...
  10. 在线网页视频播放器(flash flv播放器)