在TAO中用线程池创建CORBA服务

1、创建ORB、poa、poa_manager对象
CORBA::ORB_var orb = init_orb_with_naming_service(argc,argv); CORBA::Object_var poa_object =
orb->resolve_initial_references ("RootPOA");
PortableServer::POA_var poa =
PortableServer::POA::_narrow (poa_object.in ());
PortableServer::POAManager_var poa_manager =
poa->the_POAManager ();
poa_manager->activate ();
TAO_ORB_Manager orb_manager(orb.in(),poa.in(),poa_manager.in());
如果一切都采用默认的话,可以直接用TAO_ORB_Manager这个类协助创建。
2、创建对象并注册服务
CORBA::Object_var naming_context_object =
orb->resolve_initial_references ("NameService");
CosNaming::NamingContext_var naming_context =
CosNaming::NamingContext::_narrow (naming_context_object.in ());
CosNaming::Name name (1);
///创建对象
slib_ChannelFactory_i channelFactory_i(poa.in(),poa_manager.in());
///用默认poa激活
::slib::ChannelFactory_var channelFactory=channelFactory_i._this();
name.length (1);
name[0].id = CORBA::string_dup ("myFactory");
std::cout<<"开始注册服务"<<std::endl;
try{
naming_context->bind (name, channelFactory.in ());
}catch(CosNaming::NamingContext::AlreadyBound& ex){
naming_context->rebind (name, channelFactory.in ());
}
3、确定创建多少个线程
我采用的是一个ini格式的配置文件来存储需要多少个线程
配置文件内容如下
#本文件为windows ini格式
[ORB]
线程池大小=10
----------------------------------传说中的分割线------------------
用于读取配置的代码如下:
ACE_Configuration_Heap config;
if(config.open() == -1){
std::cerr<<"init config fail"<<std::endl;
}
ACE_Ini_ImpExp config_importer(config);
if(config_importer.import_config(config_file_name) == -1){
std::cerr<<"import config file:"<<config_file_name<<" fail"<<std::endl;
}
ACE_Configuration_Section_Key orbSection;
if(config.open_section(config.root_section(),ACE_TEXT("ORB"),0,orbSection) == -1){
std::cerr<<"open section fail"<<std::endl;
return -1;
}
ACE_TString pool_size_str;
if(config.get_string_value(orbSection,"线程池大小",pool_size_str) == -1){
std::cerr<<"get threading_pool_size fail"<<ACE_OS::last_error()<<std::endl;
return -1;
}
size_t pool_size;
try{
pool_size=slib::lexical_cast<size_t,ACE_TString>(pool_size_str);
}catch(...){
std::cout<<"转换'"<<pool_size_str<<"'到数字失败"<<std::endl;
return -1;
}
4、利用ACE_Thread_Manager创建线程池
目的是创建很多个线程去执行orb.run(),然后主线程block等其它线程返回
ACE_Thread_Manager::instance ()->spawn_n
(pool_size, &run_orb, (void *) orb_manager.orb (),
THR_DETACHED | THR_NEW_LWP);
ACE_Thread_Manager::instance ()->wait ();
此处需要写一个名为run_orb的辅助函数:
void* run_orb (void *arg)
{
try {
CORBA::ORB_ptr orb =
ACE_reinterpret_cast (CORBA::ORB_ptr, arg);
// Block indefinitely waiting for incoming
// invocations and dispatch upcalls.
orb->run ();
// After run() returns, the ORB has shutdown.
} catch (...) { /* handle exception ... */ }
return NULL;
}
注:
1、orb_manager在<tao/Utils/ORB_Manager.h>头文件中定义。链接的时候加入'pkg-config --libs TAO_Utils' (如果有autoconf的话就很方便了)
2、这有一份较老的文档,适用于ace/tao的早期版本
http://www.cs.wustl.edu/~schmidt/PDF/MT-CORBA4.pdf

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥