博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Remobjects关于Channel is Busy 错误的解决方法
阅读量:7206 次
发布时间:2019-06-29

本文共 1818 字,大约阅读时间需要 6 分钟。

使用Remobjects的单通道做服务端项目时,每当同一客户端同时发起超过一个以上的请求数据时,就会出现Channel is Busy 错误,为此我询问过Remobjects官方,他们回答是,单通道是非多线程安全的,类似这样的回答,建议我的用超级通道。可是简单地更换单通道为超级通道反而导致问题更多,由是我就想改造一下单通道。

在盒子上我曾经发布关于这个问题解决方法,但是还不合理,现在贴出来最终的解决方法,这个方法在我的程序使用后,再也没有出现以上问题
uROClient.pas内,请对照修改.
procedure TROTransportChannel.Dispatch(aRequest, aResponse : TStream);
var retry : boolean;
{$ifdef REMOBJECTS_UseEncryption}
EncRequest,EncResponse : TMemoryStream;
{$endif}
faultstartlocatoridx : integer;
lEvent: TROEvent;
ATime: Integer;
const
aIncment:Integer=10;
aMaxWaitTime:Integer =100000;
begin
retry := TRUE;

if not fThreadsafe then

_CriticalSection.Enter;//加上这一句,可能等到本次请求结束后,再执行下次请求。很实用。
try
begin
if fBusy then raise EROChannelBusy.Create(err_ChannelBusy);
fBusy := TRUE;
end;
//removed because of a warning faultstartlocatoridx := -1;

faultstartlocatoridx := InitServerLocator;

try

if Assigned(fOnSendStream)
then fOnSendStream(aRequest);

repeat

try
aRequest.Position := 0;

{$IFDEF REMOBJECTS_UseEncryption}

if Encryption.EncryptionMethod <> tetNone then begin
EncRequest:= TMemoryStream.Create;
EncResponse := TMemoryStream.Create;
try
DoEncryption(aRequest,EncRequest);
IntDispatch(encRequest, encResponse);
DoDecryption(EncResponse,aResponse);
finally
EncRequest.Free;
EncResponse.free;
end;
end
else
{$ENDIF}
begin
IntDispatch(aRequest, aResponse);
end;

aResponse.Position := 0;

if Assigned(fOnReceiveStream) then begin
fOnReceiveStream(aResponse);
aResponse.Position := 0;
end;

Exit;

except
on E:Exception do begin
retry := FALSE;

ChangeServerLocator(faultstartlocatoridx,retry,E);

//if not retry then begin
//if Assigned(fOnException) then fOnException(Self, E, retry);
if not retry then raise;
//end;
end;
end;
until not retry;
finally
if not fThreadSafe then
fBusy := FALSE;
end;
finally
if not fThreadSafe then
_CriticalSection.Release;
end;
end;

转载地址:http://xaoum.baihongyu.com/

你可能感兴趣的文章
9.22 开课第十九天(window对象)
查看>>
字符串操作总结
查看>>
Python实现批量梯度下降算法
查看>>
超时导致的Galera节点加入集群失败
查看>>
Mongodb学习笔记
查看>>
作业一
查看>>
Oracle 通过数据字典查询系统信息
查看>>
Cnetos 6 / Centos 7 修改主机名
查看>>
UIWebView
查看>>
UIViewController函数调用顺序
查看>>
第三方框架的使用
查看>>
配置Eclipse支持MacBook Pro Retina屏幕的办法(解决Retina屏幕下eclipse字体变虚的问题)...
查看>>
python导包路径的修改
查看>>
C语言第十一次作业--函数嵌套调用
查看>>
hdu 1728 逃离迷宫 *
查看>>
将Word文档转化为HTML格式的文档
查看>>
WCF
查看>>
IDE安装Lombok插件提高开发效率
查看>>
转://使用showplan.sql分析sql Performance
查看>>
第七课:增量分析
查看>>