ACE主动对象模式

  ACE主动对象模式解决的核心问题是,异步调用及线程context的切换。ACE主动对象的实现侧重于类代码段的并发访问,这种访问模式仅适合短小的处理流程,比如socket的accept请求,或者webservice调用。如果代码段处理响应速度大于请求到达速度,异步访问队列将很快被访问请求填充满,带来后续请求无法及时响应的问题。

  ACE主动对象模式实现至少涉及3个类模块:

  1:提供多线程池ACE_Task_Base或者ACE_Task或者ACE_Thread_Manager

  2:提供请求排队的ACE_Activation_Queue,其内部维护了ACE_Message_Queue的message_block消息指针队列

  3:提供了ACE_Activation_Queue队列操作实例的ACE_Method_Request,ACE_Method_Request是command模式,最低消耗仅为实现其内部的call方法。

  ACE主动对象实现需要依赖以上3个模块,至少构建2个类

  1:分发器,负责将请求参数排队,并提供数个执行线程。

  2:分发对象。请求队列的排队实例。

  看一下主动对象模式实现,以下为最精简代码:

 //////////////////////////////////////////////////////////////////////////
//分发器定义
class CActivateDispatch: public ACE_Task<ACE_MT_SYNCH>
{
public:
virtual int open (void *args = ) ;
virtual int svc(void) ;
void push();
private:
ACE_Activation_Queue cmdQueue; // 命令队列
};
//////////////////////////////////////////////////////////////////////////
//分发对象定义
class CActivateObject: public ACE_Method_Request
{
public:
CActivateObject(CActivateDispatch *pDispatch) ;
public:
int call() ;
private:
CActivateDispatch* m_pDispatch ;
};
//////////////////////////////////////////////////////////////////////////
//分发器实现
int CActivateDispatch::open (void *args)
{
//创建数个线程
return activate (THR_NEW_LWP|THR_JOINABLE, ACE_OS::num_processors() + );
}
void CActivateDispatch::push()
{
//生成命令对象,插入到命令队列中
if(cmdQueue.is_full())
ACE_DEBUG((LM_WARNING,"[%D(%t)] queue full , put away the object\n"));
else
cmdQueue.enqueue(new CActivateObject(this));
}
int CActivateDispatch::svc ( )
{
while(true)
{
//遍历命令队列,执行命令
auto_ptr<ACE_Method_Request> mo(this->cmdQueue.dequeue ());
if (mo->call () == -)
break;
}
return ;
}
void CActivateDispatch::call()
{
//do something,执行环境已切换到线程上下文
}
//////////////////////////////////////////////////////////////////////////
//分发对象实现
CActivateObject::CActivateObject(CActivateDispatch *pDispatch)
{
//分发对象构造函数
this->m_pDispatch = pDispatch;
}
int CActivateObject::call()
{
//执行环境已切换到线程上下文
if(m_pOB == NULL )
return -;
m_pDispatch->call();
return ;
}

 

ACE主动对象模式的更多相关文章

  1. ACE 主动对象模式的按部就班的实现方法

    ACE的主动对象模式的实现 对分布式系统设计来说,ACE提供的主动对象模式是让我们在系统框架构建的时候,回归到传统的单线程编程思维.你可能要问,既然有主动对象,那必然有被动对象,没有错,确实有被动对象 ...

  2. ACE主动对象模式(2)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/12/590153.html 我们简单的介绍了一下ACE主动对象实现方式,同时提出了两个问题: ...

  3. ACE主动对象模式(1)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/11/589168.html 主动对象模式用于降低方法执行和方法调用之间的耦合.该模式描述了另外 ...

  4. 设计模式- 主动对象(Active Object)

    译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...

  5. 空对象模式(Null Object Pattern)

    空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...

  6. ASP.NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式

    鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...

  7. 【设计模式 - 21】之空对象模式(Null Object)

    1      模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...

  8. 设计模式:空对象模式(Null Object Pattern)

    设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...

  9. C# 设计模式之空对象模式

    最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象 ...

随机推荐

  1. 【转】通过SQL Server 2008数据库复制实现数据库同步备份

    SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行实时数据同步,正常情况下只使用主数 ...

  2. Web开发之容器

    Web开发之容器 主题 Servlet容器.Web容器.应用服务器 参考资料   Servlet容器.Web容器.应用服务器         Servlet容器的主要任务是管理Servlet的生命周期 ...

  3. Xamarin.Forms学习之Page Navigation(一)

    在最初接触Xamarin.Forms的时候,我是跟着Xamarin官方的名为“learning-xamarin-ebook”的pdf文档进行学习的,我在成功运行Hello world程序之后,我开始跟 ...

  4. JavaScript跳出iframe框架

    一.window.top top属性返回最顶层的先辈窗口. 该属性返回对一个顶级窗口的只读引用.如果窗口本身就是一个顶级窗口,top属性存放对窗口自身的引用.如果窗口是一个框架,那么top属性引用包含 ...

  5. VS的编译选项

    转载下,对于VS的编译选项介绍蛮清楚的!! 1. 静态链接库.动态链接库.CRT.STL 我们要到一个函数,要么是需要该函数的源代码,要么是知道该函数的声明并有该函数的实现,这里的“实现”又分为静态链 ...

  6. Python 网络编程——socket

    一 客户端/服务器架构 客户端(Client)服务器(Server)架构,即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) 理想/目标状态—— 最常用的软件服务器是 ...

  7. MySQL 第五天

    回顾 连接查询: 多张表连接到一起, 不管记录数如何,字段数一定会增加. 分类: 内连接,外连接,自然连接和交叉连接 交叉连接: cross join(笛卡尔积) 内连接: inner join, 左 ...

  8. PAT 1071. 小赌怡情(15) JAVA

    1071. 小赌怡情(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 常言道“小赌怡情”.这是一个很简单的 ...

  9. 0401-服务注册与发现、Eureka简介

    一.硬编码问题 解决方案:nginx.或.服务注册与发现 二.服务发现 注册.心跳机制 三.服务发现组件的功能 1.服务注册表:是一个记录当前可用服务实例的网络信息的数据库,是服务发现机制的核心.服务 ...

  10. 如何用云存储和CDN加速网站图片视频、阿里云OSS的使用(转)

    总有人说阿里云主机带宽小,那只是因为你还停留在单机架构上. 阿里的架构设计,云主机主要用来跑程序的,附件的存储和访问主要靠OSS. 有人又会说了,OSS按存储费+流量双重计费伤不起,只是你不知道OSS ...