TAO 处理接口访问超时例程
在CORBA中有时需要判断接口访问是否超时,因为接口之间访问往往是同步操作,没有超时机制的话调用者很容易阻塞,下面例子可以帮助我们解决这个问题:
#include "helloC.h"
#include "ace/Profile_Timer.h"
#include "tao/Messaging/Messaging.h"
#include "tao/Messaging/TAO_ExtC.h"
#include
#include
#include
ACE_Profile_Timer timer; //定时器
TimeBase::TimeT timeout = 6*1000*10000; //超时6秒
int main(int argc, char ** argv)
{
CORBA::ORB_var orb;
if (argc < 2) {
printf("usage: %s
", argv[0]);
return -1;
}
orb = CORBA::ORB_init(argc,
argv,
0
ACE_ENV_ARG_PARAMETER);
if (CORBA::is_nil(orb.in()))
return -1;
CORBA::Object_var obj = orb->string_to_object(argv[1] ACE_ENV_ARG_PARAMETER);
if (CORBA::is_nil(obj.in()))
return -1;
/*获取ORB的策略对象*/
CORBA::Object_var objPolicy = orb->resolve_initial_references("PolicyCurrent"
ACE_ENV_ARG_PARAMETER);
CORBA::PolicyCurrent_var policyCur =
CORBA::PolicyCurrent::_narrow (objPolicy.in () ACE_ENV_ARG_PARAMETER);
/*设置超时*/
CORBA::Any anyTm;
anyTm <<= timeout;
/*设置ORB策略*/
CORBA::PolicyList policy_list(1);
policy_list.length (1);
policy_list[0] = orb->create_policy (Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,
anyTm
ACE_ENV_ARG_PARAMETER);
policyCur->set_policy_overrides (policy_list,
CORBA::ADD_OVERRIDE
ACE_ENV_ARG_PARAMETER);
policy_list[0]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
timer.start(); //启动定时器
ACE_TRY
{
Hello_var hello = Hello::_narrow(obj.in());
CORBA::String_var msg;
hello->message(msg); //访问服务接口
std::cout<
<
} ACE_CATCHANY {
timer.stop();
ACE_Profile_Timer::ACE_Elapsed_Time el;
timer.elapsed_time (el);
printf("elapse time is %d/n", el.real_time);
}
ACE_ENDTRY;
orb->destroy();
return 0;
}