關於Corba呼叫的Timeout 問題

qiuhj1978發表於2010-12-17

關於Corba呼叫的Timeout 問題

VisiBorker 下無論是C++ 還是 Java Corba 呼叫預設是沒有超時的。也就是說呼叫將阻塞到有返回為止

如果要配置 Timeout,就必須為Orb配置相關的Policy


C++ 如下配置

Messaging::RebindMode rebind_mode = QoSExt::VB_TRANSPARENT;

CORBA::Any rebind_value;

rebind_value <<= rebind_mode;

CORBA::Policy_var rebind_policy =

orb->create_policy(Messaging::REBIND_POLICY_TYPE,

rebind_value);

CORBA::Any con_timeout_value; // 設定Bind連線的時候的TimeOut

CORBA::Any snd_timeout_value; // 設定傳送時候的TimeOut

CORBA::Any rt_timeout_value; // 設定接收時候的TimeOut

// 5 seconds

con_timeout_value <<= (CORBA::ULongLong)(5 * 1000 * 10000);

snd_timeout_value <<= (CORBA::ULongLong)(5 * 1000 * 10000);

// 60 seconds

// note: rt = snd + rcv so rt > snd. if rt = snd, then it

// is effectively 0 and will not work.

rt_timeout_value <<= (CORBA::ULongLong)(15 * 1000 * 10000);

CORBA::Policy_var con_timeout_policy =

orb->create_policy(QoSExt::RELATIVE_CONN_TIMEOUT_POLICY_TYPE,

con_timeout_value);

CORBA::Policy_var snd_timeout_policy =

orb->create_policy(Messaging::RELATIVE_REQ_TIMEOUT_POLICY_TYPE,

snd_timeout_value);

CORBA::Policy_var rt_timeout_policy =

orb->create_policy(Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE,

rt_timeout_value);

CORBA::PolicyList policies;

policies.length(4);

policies[0] = CORBA::Policy::_duplicate(rebind_policy);

policies[1] = CORBA::Policy::_duplicate(con_timeout_policy);

policies[2] = CORBA::Policy::_duplicate(snd_timeout_policy);

policies[3] = CORBA::Policy::_duplicate(rt_timeout_policy);

// Install the policies at the orb level.

CORBA::Object_var obj =

orb->resolve_initial_references("ORBPolicyManager");

CORBA::PolicyManager_var orb_mgr =

CORBA::PolicyManager::_narrow(obj);

orb_mgr->set_policy_overrides(policies, CORBA::SET_OVERRIDE);


Java 下如下配置

org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

short rebindMode = TRANSPARENT.value;

Any con_timeout_value = orb.create_any();

con_timeout_value.insert_ulonglong(5 * 1000 * 10000); // 5 seconds

Policy con_timeout_policy =

orb.create_policy(RELATIVE_CONN_TIMEOUT_POLICY_TYPE.value,

con_timeout_value);

Any snd_timeout_value = orb.create_any();

snd_timeout_value.insert_ulonglong(5 * 1000 * 10000); // 5 seconds

Policy snd_timeout_policy =

orb.create_policy(RELATIVE_REQ_TIMEOUT_POLICY_TYPE.value,

snd_timeout_value);

Any rt_timeout_value = orb.create_any();

rt_timeout_value.insert_long(15 * 1000 * 10000); // 15 seconds

Policy rt_timeout_policy =

orb.create_policy(RELATIVE_RT_TIMEOUT_POLICY_TYPE.value,

rt_timeout_value);

Any rebindValue = orb.create_any();

RebindModeHelper.insert(rebindValue, rebindMode);

Policy rebind_policy =

orb.create_policy(REBIND_POLICY_TYPE.value, rebindValue);

PolicyManager orbManager =

PolicyManagerHelper.narrow(

orb.resolve_initial_references("ORBPolicyManager"));

// Install the policy at the orb level.

orbManager.set_policy_overrides(

new Policy[] {rebind_policy, con_timeout_policy,

snd_timeout_policy, rt_timeout_policy},

SetOverrideType.SET_OVERRIDE);

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/90000/viewspace-1043222/,如需轉載,請註明出處,否則將追究法律責任。

相關文章