在CORBA应用程序中,程序员需要调用远程对象引用的方法.然而远程对象引用可能由于某些原因而失效使得调用过程失败.一般情况下这种失败只要捕获异常再做决定即可.然后某些关键调用过程要求必须成功,对于这种需求将其抽象出一个代码框架,实现了对于远程调用失败的一种保护方法.
带保护的远程调用宏
REMOTE_PROTECT_CALL(METHOD, METHOD_NAME, FAILED_ACTION, LOCK)
参数意义:
METHOD:调用函数,就是实际的方法调用代码
METHOD_NAME:函数名字,字符串,框架使用它打印出错误信息
FAILED_ACTION:调用失败时的处理代码,程序员自定义的调用失败时的处理办法
LOCK:多线程环境下的同步锁,有些情况下,可能多个线程在调用同一个方法,如果多个线程都调用失败则都会执行错误处理代码.使用锁确保只有一个线程在做错误处理
使用例子,假设有这样的接口
interface Remote{
short fun(in short arg);
};
如果调用失败,则调用unBindObj和bindObj重新获取对象引用
代码如下:
Remote_var obj = ...//获取对象引用
MTLMonitor lock;
REMOTE_PROTECT_CALL(obj->fun(3),
"obj->fun(3)",
unBindObj();bindObj();,
lock);
框架代码如下:
//定义带有保护的远程调用框架
#define MAX_TRY_REMOTE_CALL_FAILED_CT 5
#define REMOTE_PROTECT_CALL(METHOD, METHOD_NAME, FAILED_ACTION, LOCK)
MTLSynchronized sync(LOCK);
while(1) 
...{
int count = 0;
bool remoteCallFlag = false;
while(count < MAX_TRY_REMOTE_CALL_FAILED_CT) 
...{
count++;
try 
...{
METHOD;
remoteCallFlag = true;
break;
}
catch (const CORBA::Exception& ex) 
...{
STAR_COUT<<"Remote Call "<<METHOD_NAME<<"failed. Try again... ..."<<STAR_ENDL;
}
MTLThread::sleep(TRY_REMOTE_CALL_INTERVAL);
}
if(!remoteCallFlag) 
...{
FAILED_ACTION;
}
else
break;
}
LOCK.notify();
本文介绍了一个用于CORBA应用的代码框架,该框架通过宏REMOTE_PROTECT_CALL提供对远程调用失败的保护。当远程对象引用失效导致调用失败时,该宏允许指定错误处理代码,并在多线程环境中使用同步锁确保唯一错误处理。示例展示了如何在接口Remote的fun方法调用中应用此框架。
5642

被折叠的 条评论
为什么被折叠?



