按需激活
伺服(Servant)管理器
在先前的示例中,我们对使用同步方法调用的简单客户端进行了扩展,用于处理异步请求:通过使用回复处理器的异步方向调用。
在应用程序中有许多对象,没有必要在同时激活所有的对象,并且,如果同时激活所有对象会导致占用过多的内存或过多的数据库查询。为了解决这类应用程序面临的问题,POA提供了一个选项让应用程序提供伺服管理器,伺服管理器可以在每一个请求上动态的提供伺服。
伺服管理器是一个回调对象,应用程序把它和POA注册在一起。当POA试图确定与特定请求关联的伺服是,它回调应用程序的伺服管理器来找回伺服。想要把伺服管理器与POA注册在一起,就要把控制请求与伺服关系的这个RequestProcessingPolicyValue设置为USE_SERVANT_MANAGER。
根据POA是否把对象与伺服的关联是否保存在它的主动对象映射表(Active Object Map),我们把伺服管理器分为两种类型。这取决于当POA创建时为ServantRetentionPolicy设的值。如果设为 RETAIN,那么POA保留关联,如果设为NON_RETAIN,POA则不在对象和伺服中保留任何关联。
在POA是具有RETAIN 的情况下伺服管理器必须激活与对象关联的伺服。这需要伺服管理器对象支持ServantActivator 接口。在POA是具有NON_RETAIN 的情况下,我们的伺服管理器对象将能够为请求的对象找到伺服并调用它。
在本示例中,让我们使用伺服的定位器来当在象被调用时来定位与我们的对Stock_Factory对象关联的伺服。
The Stock Factory 定位器的实现
我们的Stock_Factory_Locator_i将帮助我们找到Quoter_Stock_Factory伺服。
伺服定位接口提供两个操作:调用前和调用后(preinvoke 和postinvoke)。preinvoke 操作被调用时用于找回伺服来分发请求。preinvode返回的伺服仅用于单一的请求。postinvode操作后来被调用,用于销毁被preinvode操作创建的伺服。
#include "tao/corba.h"
class Quoter_Stock_Factory_Locator_i : public POA_PortableServer::ServantLocator
{
public:
Quoter_Stock_Factory_Locator_i (CORBA::ORB_ptr orb);
// Preinvoke function
virtual PortableServer::Servant preinvoke (const PortableServer::ObjectId &oid,
PortableServer::POA_ptr poa,
const char * operation,
void * & cookie);
// Postinvoke function
virtual void postinvoke (const PortableServer::ObjectId & oid,
PortableServer::POA_ptr poa,
const char * operation,
void * cookie,
PortableServer::Servant servant);
private:
CORBA::ORB_var orb_;
};
In the implementation of the preinvoke
operation, we check if the object ID is valid and then check for the servant we want to create and create and return the requested servant.
在 preinvoke 操作的实现中,我们检查对象的ID 是否有效,然后检查我们想要创建的伺服和返回请求的伺服。
PortableServer::Servant
Quoter_Stock_Factory_Locator_i::preinvoke (const PortableServer::ObjectId &oid,
PortableServer::POA_ptr poa,
const char * operation,
void * & cookie)
{
try {
// Get the ObjectID in string format
CORBA::String_var oid_str =
PortableServer::ObjectId_to_string (oid);
// Check if the ObjectId is valid
if (strcmp (oid_str.in (), "Quoter/Stock_Factory") != 0) {
// Create the requested servant.
PortableServer::Servant servant =
new Quoter_Stock_Factory_i ();
cookie = servant;
return servant;
}
else {
throw CORBA::OBJECT_NOT_EXIST ();
}
}catch (const CORBA::BAD_PARAM &) {
throw CORBA::OBJECT_NOT_EXIST ();
}
postinvoke
操作的实现很简单。我们仅仅是销毁在preinvoke 操作中创建的伺服。在这两个操作中的参数 Cookie IDL type帮助把preinvoke的调用和postinvoke 操作关联在一起。
void
Quoter_Stock_Factory_Locator_i::postinvoke (const PortableServer::ObjectId &oid,
PortableServer::POA_ptr poa,
const char * operation,
void * cookie,
PortableServer::Servant servant)
{
// Delete the servant as it is no longer needed.
PortableServer::Servant my_servant = (PortableServer::Servant) cookie;
if (servant == my_servant)
delete servant;
}
服务端的实现
第一平上从RootPOA创建一个新的POA,这个新的POA具有以下特性: RequestProcessingPolicy的值设为USE_SERVANT_MANAGER ,并且ServantRetentionPolicy的值设为NON_RETAIN。
CORBA::PolicyList policies (3);
policies.length (3);
// Assign the polices
policies [0] =
poa->create_id_assignment_policy (PortableServer::USER_ID);
policies [1] =
poa->create_request_processing_policy
(PortableServer::USE_SERVANT_MANAGER);
policies [2] =
poa->create_servant_retention_policy (PortableServer::NON_RETAIN);
// Create the POA with these policies
PortableServer::POA_var child_poa =
poa->create_POA ("childPOA",
poa_manager.in (),
policies);
// Destroy the policy objects
for (CORBA::ULong i = 0; i != policies.length (); ++i) {
policies[i]->destroy ();
}
把策略赋值后,根据这些策略创建了childPOA,因为这些策略对象在create_POA中复制了一个拷贝,所以之后我们就不必再使用它们了,因此把它们删除。
由于我们拥有支持伺服管理器的POA,所以接下来为服务定位器对象创建伺服,激活它以找回它的引用, 然后给childPOA设置伺服管理器。
// Create a Stock_Factory_Locator servant
Quoter_Stock_Factory_Locator_i servant_locator_i(orb.in ());
// Need to activate a servant_manager object in the Root POA
PortableServer::ServantLocator_var servant_locator =
servant_locator_i._this ();
// Set the SM with the childPOA
child_poa->set_servant_manager (servant_locator.in ());
由于我们给childPOA设置了伺服管理器,接下来通过在childPOA中创建的用户自创建ID 来创建引用,
这个childPOA使用了Quoter_Stock_Factory_Locator_i。create_reference_with_id 操作
让我们创建了需要要的对象而无须实际的创建它的伺服。应用程序提供 了ObjectID,这个对象标识在应用程序领域更具有语义。
// Get the Object Id
PortableServer::ObjectId_var child_oid =
PortableServer::string_to_ObjectId ("childFoo");
//Create the Object without creating the servants
CORBA::Object_var stock_factory =
child_poa->create_reference_with_id (child_oid.in (),
"IDL:Quoter/Stock_Factory:1.0");
在这之后,和以前一样,我们把对角引用转为IOR字符串,并打印出来。
// Put the object reference as an IOR string
CORBA::String_var ior = orb->object_to_string (stock_factory.in ());
// Print it out!
std::cout
练习
Modify the server.cpp in
the simple server to use servant managers and locators. Use
these files to help complete the implementation.
Stock_Factory_locator_i.h Stock_Factory_locator_i.cpp
Makefile.
解决方案
Look at the server.cpp file. It should not
be much different from yours.
测试
A client which uses request handlers is provided:
client.cpp. As before the
following files are provided.
Quoter.idl Stock_i.h Stock_i.cpp Stock_Factory_i.h
Stock_Factory_i.cpp Handler_i.h and
Handler_i.cpp.
More Reading
The
The Henning and
Vinoski
CORBA book
discusses POA policies in detail. Likewise, the Schmidt and Vinoski
columns
in C++ Report also include several articles about the POA. Finally,
the TAO
distribution includes
examples that illustrate how to use the POA policies.
分享到:
相关推荐
- **7.5 实现和所需更改**:说明在项目中实现TAO::Transport::Current时可能需要做的更改。 - **7.6 结构和占用空间影响**:分析使用TAO::Transport::Current对程序结构和内存占用的影响。 - **7.7 性能影响**:评估...
**TAO程序员指南(入门教程)** 在编程领域,TAO(Test and Automation Objects)是一个重要的框架,主要用于自动化测试和系统集成。它提供了一种结构化的、可扩展的方式来设计和实现复杂的测试用例和自动化流程。这...
The Tao of Microservices Authors: Richard Rodger ISBN 10: 1617293148 ISBN 13: 9781617293146 Edition: 1 Released: 2017-12-31 Format: Paperback (328 pages) List Price: $49.99 ...
4. 对象生存期(Object Lifespan):定义了对象何时可以被撤销或销毁,如按需激活、持久化等。 在描述的项目案例中,"TAO对象生命周期服务"示例展示了如何利用TAO的这些特性来构建网络通信程序。程序结构清晰,包括...
- **TAO::Transport::Current 特性**:探讨此特性的使用方法。 - **安全**:介绍 SSL IOP 和相关配置。 - **实时 CORBA**:讨论实时环境下的协议策略。 - **CORBA/e**:概述 CORBA/e 标准及 TAO 的支持情况。 - **...
Provide a data store with a graph abstraction (vertexes and edges), not keys/values Explicitly favor efficiency and availability over consistency
The Tao of Network Security Monitoring Beyond Intrusion Detection By Richard Bejtlich Pages : 832 英文
2. **编译器**: 选择合适的编译器,如GCC或Visual Studio,确保支持CORBA和TAO所需的特性。 3. **基本设置**: 配置环境变量,如设置ACE和TAO的头文件和库路径。 4. **开始编译**: 运行构建脚本,如`make`或`msbuild`...
#### 八、TAO的Transport Current Feature 这一特性允许开发者在运行时动态改变传输策略,如更改传输协议、加密级别等,从而提高了应用程序的灵活性和安全性。 #### 九、安全性和SSL IOP TAO支持SSL IOP(安全套...
【TAO CORBA CPP 编程指南 C++】是一份详细介绍如何使用TAO(The ACE ORB)在C++环境中进行CORBA编程的文档。TAO是由美国华盛顿大学的Douglas C. Schmidt教授领导开发的实时CORBA平台,它是一个遵循CORBA 2.6规范的...
- **Using the TAO::Transport::Current Feature**(使用TAO::Transport::Current特性):第48页开始,介绍了该特性的作用域、上下文、配置等方面的信息。 - **Security**(安全):第57页开始,提供了关于使用SSL ...
### TAO: Facebook的分布式数据存储系统用于社交图谱 #### 概述 Facebook作为全球最大的社交媒体平台之一,面临着管理海量用户数据的巨大挑战。为了高效地处理这些数据,并为用户提供流畅且个性化的体验,Facebook...
### TAO程序员指南之Getting Started 知识点详解 #### 一、概述 **TAO (The ACE ORB)** 是一个著名的开源免费CORBA(Common Object Request Broker Architecture)实现,广泛应用于分布式系统的开发中。本篇文章将...
在VS2008中新建一个C++项目,然后在源代码中导入TAO的头文件,并使用ORB(Object Request Broker)接口来创建和激活对象。一个基本的示例可能包括定义一个接口(IDL文件),生成对应的C++代码,然后创建ORB、注册...
这一版本支持VC++6.0编译,若需使用其他版本的ACE与TAO,请确保它们与你使用的Visual C++版本兼容。 - **解压缩**:将下载的文件解压缩至所需目录,其中包含所有文件的 `ACE_wrappers` 目录。在后续步骤中,我们将...
ACE(Adaptive Communication Environment)和TAO(The ACE ORB)是两个开源的软件框架,主要应用于分布式系统和网络通信。ACE提供了一组C++库,用于构建高性能、跨平台的应用程序,而TAO是基于ACE的一个ORB(Object...
淘网址(tao123)源码今日发布,整站源码完美完成,唯一一个支持二级目录无错乱的源码,满足使用二级目录做站的朋友,淘123的源码结构简单清晰,适合各大草根站长,源码完全免费,源码一如既往纯净、完整、无错乱、无...
这个名为“Matlab7.0教程和例题”的压缩包显然旨在为初学者提供一个全面的学习资源,帮助他们掌握MATLAB的基本操作和应用。下面将详细讨论MATLAB的基础知识以及可能在例题中涉及到的关键概念。 首先,MATLAB的基础...
【标签】"tao tao_catior" 这两个标签明确了压缩包的主要内容是关于 TAO 技术以及与之关联的 "tao_catior" 工具。TAO 是一个测试框架,它允许在各种编程语言和平台上编写可互操作的测试代码。"tao_catior" 可能是 ...