论软件接口中几种底层通讯的实现
2010-02-19 20:32:58 来源:WEB开发网2、中间件通讯
目前中间平台也比较多,我所使用的中间件有BEA的Tuxedo和东方通的TongEasy,TongEasy我就不说了,主要讨论一下Tuxedo。BEA Tuxedo系统提供九种通信模式:
⑴.同步Request/Response模式;
⑵.异步Request/Response模式;
⑶.嵌套调用;
⑷.调用转发;
⑸.会话通信;
⑹.主动消息通告;
⑺.基于事件的通信;
⑻.基于队列的通信;
⑼.使用事务。
同步请求/应答方式比较简单,因此在应用中也使用得相当多。但是同步请求/应答方式在服务端服务端反应比较慢时造成阻塞,如果使用了多线程方式,不管Tuxedo采用长连接还是短连接均容易造成线程挂起,不能再进行后续处理,很多情况需要程序重启。采用异步方式不会造成阻塞,但需要去查询是否有应答消息,下面的代码实现了使用异步函数实现同步调用的功能,增加了超时处理,这样不会导致程序阻塞:
int tpcallex(char *svc, char *idata, long ilen, char **odata, long *olen, long flags, long timeout)
{
const int err_invoke_result = -1;
int iHandler=0;
int iResult=0;
int iTimeOut=timeout;
iHandler = tpacall((char *)svc, (char *)idata, ilen, (long)TPNOBLOCK);
if(iHandler == err_invoke_result)
{
return iHandler;
}
while(iTimeOut>0)
{
iResult = tpgetrply(&iHandler, (char **)odata, olen, (long)TPNOBLOCK);
if(iResult == err_invoke_result)
{
Sleep(10);
iTimeOut -= 10;
continue;
}
break;
}
if(iTimeOut<=0)
{
tpcancel(iHandler);
return err_invoke_result;
}
return iHandler;
}
如果要增加接口的处理能力,使用多线程方式会存在隐患,最好的方式是采用多进程,不过存在如何消息均衡的问题。
更多精彩
赞助商链接