`
pleasetojava
  • 浏览: 729541 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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 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 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.cppserver.cpp.

配置

迄今为止我们在TAO中使用的是默认的配置,但是通过好的调整能让AMI可以工作得更好。例如,默认的TAO为每个显示的请求使用单独的连接。这对于同步方向调用(SMI)来说是一个好的策略,因为用单独的线程发送并发的请求不需要用到共享的资源,但这个方法对于异步方法调用(AMI)来说缺少可伸缩性,这是因为它需要创建过多的连接。本解决方案改变策略用于使连接可被共享。为了达到这个目的,我们需要创建一个下面内容的svc.conf文件:

static Client_Strategy_Factory "-ORBTransportMuxStrategy MUXED"

还有许多其它的配置选项,这些都描述在文档 Options.htmlconfigurations.html 和来自OCI的开发者指南中。

分享到:
评论

相关推荐

    Java SE 8 for the Really Impatient

    Now, with Java SE 8 for the Really Impatient , internationally renowned Java author Cay S. Horstmann concisely introduces Java 8’s most valuable new features (plus a few Java 7 innovations that haven...

    core java se 9 for impatient

    《Core Java SE 9 for the Impatient》是针对已有一定Java基础的程序员设计的一本速成教程,旨在帮助他们快速掌握Java SE 9的新特性和关键概念。这本书深入浅出地介绍了Java编程语言的最新版本,使读者能够在短时间...

    Scala.for.the.Impatient.2nd.Edition

    《Scala for the Impatient》第二版是一本针对初学者的Scala编程语言教程,以其简洁明快的风格和实战导向的教学方法而备受推崇。本书旨在帮助读者迅速掌握Scala的基础知识,并深入理解其高级特性,以便在实际开发中...

    TeX for the Impatient

    ### TeX for the Impatient — 关键知识点概览 #### 一、使用本书(Using this book) 本章节主要介绍如何高效地使用这本手册。它包括了语法约定、命令描述等基本指南,帮助读者理解手册的结构和用法。 - **语法...

    Java SE 8 for the Really Impatient epub

    Java SE 8 for the Really Impatient 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Core Java for the Impatient mobi

    Core Java for the Impatient 英文mobi 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Core Java for the Impatient azw3

    Core Java for the Impatient 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Scala for the Impatient 完整版带书签

    ### Scala for the Impatient:快速学习Scala的指南 #### 一、书籍简介 《Scala for the Impatient》是一本由Cay S. Horstmann所著的关于Scala编程语言的入门书籍,它被誉为是快速学习Scala的最佳选择之一,并且...

    scala for the impatient

    Scala运行于Java虚拟机之上,为程序员提供了一个可以无缝访问大量Java库和工具的平台。它以其简洁的语法、面向对象和函数式编程的结合、静态类型以及快速的交互式实验环境而受到开发者的青睐。 本书《Scala for the...

    Scala for the Impatient

    本书《Scala for the Impatient》是为那些对快速学习Scala编程感兴趣但又不愿意阅读长篇大论的读者所写的。作者Cay S. Horstmann假设读者已经有了Java、C#或C++等语言的编程背景,因此不会在变量、循环或类等基础...

    java8-impatient:我对《真正不耐烦的 JAVA SE 8 》一书中的练习解决方案的尝试,ISBN 0321927761

    《真正不耐烦的JAVA SE 8》是一本旨在帮助开发者快速掌握JAVA 8新特性的书籍,通过解决书中给出的练习,读者可以深入理解这些特性。这本书的ISBN号为0321927761。在这个压缩包文件"java8-impatient-master"中,很...

    经典书籍 Scala for the Impatient.pdf

    ### 经典书籍《Scala for the Impatient》知识点解析 #### 一、书籍概述 《Scala for the Impatient》是一本旨在帮助读者快速掌握Scala语言的实用书籍。本书由Cay S. Horstmann撰写,他是一位知名的计算机科学教授...

    impatient:一种将异步事物变成自己不耐烦的版本的工具

    一种将异步事物变成自己不耐烦的版本的工具 安装 npm installimpatient 用法 var impatient = require ( 'impatient' ) ; var sleep = require ( 'sleep-promise' ) ; // impatient promise (wait for 1000ms but ...

    读书笔记:Scala for the Impatient 《快学Scala》第一版习题代码.zip

    读书笔记:Scala for the Impatient 《快学Scala》第一版习题代码

Global site tag (gtag.js) - Google Analytics