在TAO/example/Simple/Bank的例子中,在AccountManager中定义了两种idl方法:open和close,前者是生成一个新的激活的Account servant,后者是回收它。AccountManager_i类似于:
Bank::Account_ptr
AccountManager_i::open (const char *name,
CORBA::Float initial_balance)
{
Account_i_var result;
if (hash_map_.find (name, result) != 0)
{
Account_i *tmp = 0;
ACE_NEW_THROW_EX (tmp,
Account_i (name,
initial_balance),
CORBA::NO_MEMORY ());
result = tmp;
}
// Generate an IOR for the result object and register it with the
// POA. In case the object already exists then the previously
// generated IOR is returned.
return result->_this ();
}
// Shutdown.
void
AccountManager_i::close (Bank::Account_ptr account)
{
try
{
CORBA::String_var name = account->name ();
Account_i_var account;
..
if (account.is_nil ())
{
PortableServer::POA_var poa = account->_default_POA ();
PortableServer::ObjectId_var id = poa->servant_to_id (account.in ());
poa->deactivate_object (id.in ());
}
}
catch (const CORBA::Exception& ex)
{
ex._tao_print_exception ("Unable to close Accountn");
}
}
问题是1) result(新创建的帐户仆人)是否与open方法中的AccountManager_i共享相同的ORB对象?我如何用一个新的复制ORB为这个仆人重置它?
2) 何时在关闭方法中回收帐户(在Bank::account_ptr帐户中)对象。在该方法中,它仅被停用并与POA分离。
在POA下激活了一个服务对象,因此,如果您希望在新的ORB下激活帐户服务对象,则必须在某个位置创建该ORB,创建一个新的POA,并覆盖帐户服务对象中的_default_POA方法以返回不同的POA。另一种选择是不使用_this,而是手动激活POA。
在close方法中,if(account.is_nil())应该是!account.is_nil()。仆人被引用计数,当最后一个引用被删除时,我看不到任何代码被回收。