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

ACE小技巧:在ACE_Acceptor框架中,自定义服务处理器的创建

阅读更多

ACE小技巧:在ACE_Acceptor框架中,自定义服务处理器的创建

Stone Jiang

ACE_Acceptor框架使对新连接的侦听变得容易,也使创建和激活新连接的ACE_Svc_Handler的派生类变得容易。之前我们已经了解了ACE_Svc_Handle::open()挂勾函数和服务处理器初始化时它所扮演的角色。本文我们回退几步,来了解服务处理器是如何实例化的以及我们如何自定义它的行为。

再看看ACE_Acceptor类,它是一个模板类,第一个模板参数ACE_Accetpor是代表与服务建立连接的处理器。当新的连接建立时,ACE_Acceptor调用make_svc_handler()挂勾函数来实际创建的新建服务处理器对象。ACE_Acceptor::make_svc_handler()的实现如下:

template<classSVC_HANDLE,ACE_PEER_ACCEPTOR_1>
int
ACE_Acceptor
<SVC_HANDLE,ACE_PEER_ACCEPTOR_2>::make_svc_handler(SVC_HANDLE*&sh)
{
ACE_TRACE(
"ACE_Acceptor<SVC_HANDLER,ACE_PEER_ACCEPTOR_2>::make_svc_handler");if(sh==0)
ACE_NEW_RETURN(sh,
SVC_HANDLER,
-1);//Setthereactorofthenewlycreated<SVC_HANDLER>tothesame
//reactorthatthis<ACE_Acceptor>isusing.
sh->reactor(this->reactor());
return0;

}

默认的实现包括了两步基本操作:
1. 获得一个新的SVC_HANLDER对象, 这里是使用的new运算符分配的。
2. 设置新的服务处理器的reactor指针为ACE_Accetpor使用的reactor的。

然而,如果应用程序需要通过其它方式获得SVC_HANDLER对象,而不是通过默认的构造函数那种动态分配,这又该怎么办呢?举例来说,我们可能需要:
. 从一个预分配的池中获得SVC_HANDLER对象;
. 为新创建的SVC_HANDLER传入一些额外的信息
. 使用单体的SVC_HANDLER

上面这些情形,我们都可以自定义make_svc_handler()挂勾函数来实现必要的行为。例如,假定我们新的处理器需要拥有一个处理所有对所有接收到的消息进行集中处理的中心处理器。这个中心处理器我们用类Processor表示。我们需要每个服务处理器都拥有一个指向中心处理器的指针,而不是使Processor成为一个全局访问的指针(使用全局变量的种种弊端本文不作详述)。我们的解决办法是: 从ACE_Accetor派生一个新类,这个新类拥有Processor的指针作成员,并且,在创建新和服务处理器(Service)的时候,把这个 Processor的指针作参数传进去。

新的acceptor类可以这样定义:

classMy_Acceptor:publicACE_Acceptor<Service,ACE_SOCK_ACCEPTOR>
...{
public:
My_Acceptor(Processor
*processor):processor_(processor)...{};

intmake_svc_handler(Service*&sh)
...{
if(sh==0)
ACE_NEW_RETURN(sh,
Service(
this->processor_),
-1);//Setthereactorofthenewlycreated<SVC_HANDLER>tothesame
//reactorthatthis<ACE_Acceptor>isusing.
sh->reactor(this->reactor());
return0;
}


private:
Processor
*processor_;
}

就这样,现在,当My_Acceptor接受新连接的时候,make_svc_handler()挂勾函数分配一个新的处理器(Service),并把Processor*作为参数传进去。需要注意的事,尽管这里使用

的是这一个构造函数Service(Processor*)。我们仍需求为Service类定义默认的构造函数,以满足模板类ACE_Acceptor的需要。

分享到:
评论

相关推荐

    ACE技术内幕:深入解析ACE架构设计与实现原理

    《ace技术内幕:深入解析ace架构设计与实现原理》从构架模式、编程示例和源代码3个维度系统地对经典网络框架ace(adaptivemunicationenvironment)的架构设计和实现原理进行了深入分析,它能解决4个方面的问题:,...

    ACE技术论文集(已翻译为中文)

    此论文集汇集了10篇外国技术专家在...第 9 章 接受器-连接器(Acceptor-Connector):用于连接和初始化通信服务的对象创建模式 第 10 章 服务配置器(Service Configurator)模式:通过服务配置器模式动态配置通信服务

    Herm(一套快速开发高性能的网络应用的C++库)

    基于Utilities和Socket的简化开发网络应用的框架,抽象出Peer和Session对象。Peer和Session对象以及Framework实现的功能将在第2章介绍。 Herm目前仅支持Linux/Windows/FreeBSD 32bits平台。调用者可以基于不同的...

    基于python的Paxos算法实现

    理解一个算法最快,最深刻的做法,我觉着可能是自己手动实现,虽然项目中不用自己实现,有已经封装好的算法库,供我们调用,我觉着还是有必要自己亲自实践一下。 这里首先说明一下,python这种动态语言,对不熟悉的...

    JCM.rar_JCM_JCM Cash Acceptor_JCM Manual_YU3I_valuable32s

    JCM Cash Acceptor Operational Manual

    esp32驱动ses价签墨水屏

    esp32驱动ses价签墨水屏。适用于24pin屏幕。

    精通并发与 netty 视频教程(2018)视频教程

    57_Reactor模式透彻理解及其在Netty中的应用 58_Reactor模式与Netty之间的关系详解 59_Acceptor与Dispatcher角色分析 60_Netty的自适应缓冲区分配策略与堆外内存创建方式 61_Reactor模式5大角色彻底分析 62_Reactor...

    精通并发与netty视频教程(2018)视频教程

    75_适配器模式与模板方法模式在入站处理器中的应用 76_Netty项目开发过程中常见且重要事项分析 77_Java NIO Buffer总结回顾与难点拓展 78_Netty数据容器ByteBuf底层数据结构深度剖析 79_Netty的ByteBuf底层实现大...

    CentOS7.2.1511 gcc4.8.5 通过编译的 tfs2.2.16

    session_util.cpp:31:9: 错误:‘int tfs::common::SessionUtil::parse_session_id(const string&, int32_t&, int64_t&)’的原型不匹配类‘tfs::common::SessionUtil’中的任何一个 int SessionUtil::parse_session...

    ACE最好的教程

    最为一个ACE的过来人,觉得网上的资源都不太系统,而直接看例子有些...我认为最简洁的讲述ACE的Reactor、Acceptor、Barrier等概念的,就是这份英文的网页讲解,作为入门是极好的。 英文的,但是极其简单,不用困扰~

    pmm_v1:COVID-19中的后孟德尔遗传模型

    COVID-19中的后孟德尔遗传模型 ...对于所有分析,仅保留在Ensemble中被分类为具有高或中等影响的变量,即:'transcript_ablation','splice_acceptor_variant','splice_donor_variant','stop_gai

    论文研究-ACE中设计模式在分布式网络服务中的应用研究.pdf

    以网关应用服务的构建为例,详细探讨如何利用Acceptor-Connector模式来构建分布式网络服务的过程。通过分析其构造过程可知,利用Acceptor-Connector模式可提高程序的灵活性、可扩展性,减少重复开发代码工作量。

    精通并发与netty 无加密视频

    第75讲:适配器模式与模板方法模式在入站处理器中的应用 第76讲:Netty项目开发过程中常见且重要事项分析 第77讲:Java NIO Buffer总结回顾与难点拓展 第78讲:Netty数据容器ByteBuf底层数据结构深度剖析 第79讲...

    bill-acceptor:Akka 演员通过 rs-232 串行连接与票据接受者进行通信

    ID-003 协议(即将推出)用法在 Akka 父actor 中实例化acceptoractor。 import inc.pyc.bill.acceptor._, Events._, Commands._lazy val acceptor = context.actorOf(BillAcceptor.props(context.system), ...

    DFA-acceptor.rar_DFA

    dfa acceptor for compiler course....

    事件驱动多线程网络框架

    更直接的操作在Acceptor和TcpConnection中,其中的 Acceptor 对应了接受连接的socketfd,而TcpConnection则封装了socket的读写操作,在Server的构造函数中会创建一个Acceptor类,真正accept成功以后又会调用到Server...

    A Tutorial Introduction to the ADAPTIVE Communication Environment (ACE)

    ACE tutorial, 很适合ACE初学者~ 书中除了对概念的介绍,还有代码作为例子,帮助理解~ 目录包括: - THE ADAPTIVE COMMUNICATION ENVIRONMENT - IPC SAP - MEMORY MANAGEMENT - THREAD MANAGEMENT - TASKS AND ...

    rust-futurepool:用于可预测并发的简单未来池库

    for req in some_acceptor. iter () { // This creates 2 tasks in the future pool // to be executed asynchronously: // 1. execute the handler // 2. respond to the request when #1 is com

Global site tag (gtag.js) - Google Analytics