调用手动创建的服务实例后检测到RemObjects泄漏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用手动创建的服务实例后检测到RemObjects泄漏相关的知识,希望对你有一定的参考价值。

我有以下代码,它创建一个RemObjects服务的实例,并调用.net服务器

class function TLabelPrintingServiceProxy.GetInstance: ILabelPrintingManager;
var
  LRoRemoteService: TRoRemoteService;
begin
  LRoRemoteService := TRoRemoteService.Create(nil);
  LRoRemoteService.Message := TROSOAPMessage.Create();
  LRoRemoteService.Channel := TROIndyHTTPChannel.Create(nil);
  LRoRemoteService.Channel.TargetUri := TROUri.Create(ILabelPrintingIntf.LabelPrintingManager_EndPointURI);

  Result := (LRoRemoteService as ILabelPrintingManager);
end;

调用.net服务是这样执行的:

  try
        Result := BinaryArray.Create;
        LLabelPrintingManager := TLabelPrintingServiceProxy.GetInstance();
        Result.Add(LLabelPrintingManager.GetVSSLabelImage(APrintJob));
    finally 
        TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(LLabelPrintingManager);
    end;

调用完成后,RemObjects应自动释放LLabelPrintingManager接口,但它不会泄漏使用的对象。

我已尝试使用ReleaseLabelPrinting ServiceProxy实例(下面的代码)手动释放服务实例中的所有对象,但它仍然在泄漏

class procedure TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(aILabelPrintingManagerIntf: ILabelPrintingManager);
var
  lProxy: TRoProxy;
begin
  lProxy := TROProxy(aILabelPrintingManagerIntf);
  TROIndyHTTPChannel(lProxy.__TransportChannel).TargetUri.Free;
//  TROIndyHTTPChannel(lProxy.__TransportChannel).Free; this is generating an AV
  TRoMessage(lProxy.__Message).free;

  TRoRemoteService(aILabelPrintingManagerIntf).Free;

我错过了什么?

答案

在与RemObjects的人讨论后,这是解决方案:

class function TLabelPrintingServiceProxy.GetRemoteServiceInstance: TRoRemoteService;
var
  LRoRemoteService: TRoRemoteService;
begin
  Result := TRoRemoteService.Create(nil);
  Result.Message := TROSOAPMessage.Create();
  Result.Channel := TROIndyHTTPChannel.Create(nil);
  Result.Channel.TargetUri := TROUri.Create(ILabelPrintingIntf.LabelPrintingManager_EndPointURI);
end;

呼叫

try
  LLabelPrintingRemoteService := TLabelPrintingServiceProxy.GetRemoteServiceInstance();
  (LLabelPrintingRemoteService as ILabelPrintingManager).PrintVSSJob(printJob);
finally
  TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(LLabelPrintingRemoteService);
end;

并释放对象

try
  LLabelPrintingRemoteService := TLabelPrintingServiceProxy.GetRemoteServiceInstance();
  (LLabelPrintingRemoteService as ILabelPrintingManager).PrintVSSJob(printJob);
finally
  TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(LLabelPrintingRemoteService);
end;

以上是关于调用手动创建的服务实例后检测到RemObjects泄漏的主要内容,如果未能解决你的问题,请参考以下文章

使用RemObjects Pascal Script (转)

单例模式整理

Spring注解 - 生命周期属性赋值自动装配

appscan入门操作

解决:一个服务器oracle多实例有一个实例没启动,需手动启动操作指引教程

RestSharp 显示无法创建接口实例的错误必须手动反序列化