Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)qq
published in(发表于) 2014/7/9 1:34:48
.NET Remoting 租约机制管理有状态的对象的生存期

.NET Remoting 租约机制管理有状态的对象的生存期

.NET Remoting 租约机制管理有状态的对象的生存期

在CLR(公共语言运行库)中,框架提供了GC(垃圾回收器)来管理内存中对象的生命周期。同样的,.Net Remoting使用了一种分布式垃圾回收,基于租用的形式来管理远程对象的生命周期。

早期的DCOM体系对于对象生命周期的管理是通过ping和引用计数来确定对象何时应当作为垃圾回收。然而ping引起的网络流量对分布式应用程序的性能是一种负担,它极大地影响了分布式处理的整体性能。

.Net Remoting在每个应用程序域中都引入一个租用管理器,为每个服务器端的SingleTon(远处对象的模式,指明服务器所有的客户端都可以共享对象),或每个客户端激活的远程对象保存着对租用对象的引用。

说明:服务器端激活的SingleCall远程对象模式是指每一次调用远程对象时,都会创建一个新的实例。这意味着它是无状态的,对于每个激活的远程对象,都由CLR的GC(垃圾回收器)来自动回收,因此对于SingleCall模式激活的远程对象,不存在生命周期的管理。

下面详细介绍管理远程类对象的3个部分。

1.租用

租用是个封装了TimeSpan类型值的对象,用以管理远程对象的生存期。在.Net Remoting中提供了定义租用功能的ILease接口。当Remoting通过SingleTon模式或客户端激活模式来激活远程对象时,租用对象调用从System.MarshalByRefObject类继承的InitializeLifetimeService方法,向对象请求租用。

ILease接口定义了有关生命周期的属性,均为TimeSpan值,具体介绍如下所示。

InitialLeaseTime:初始化有效时间,默认值为300s,如果为0,表示永不过期。

RenewOnCallTime:调用远程对象一个方法时的租用更新时间,默认值为120s。

SponsorshipTimeout:超时值,通知Sponsor(发起人)租用过期后,Remoting会等待的时间,默认值为120s。

CurrentLeaseTime:当前租用时间,首次获得租用时,为InitializeLeaseTime的值。

Remoting的远程对象因为继承了MarshalByRefObject类,因此默认继承了InitializeLifetime Service方法,那么租用的相关属性为默认值。如果要改变这些设置,可以在远程对象中重写该方法。例如:

public override object InitializeLifetimeService()

{

ILease lease = (ILease)base.InitializeLifetimeService();

if (lease.CurrentState == LeaseState.Initial)

{

lease.InitialLeaseTime = TimeSpan.FromMinutes(1);

lease.RenewOnCallTime = TimeSpan.FromSeconds(20);

}

return lease;

}

将对象的租用周期改变为无限,代码如下:

public override object InitializeLifetimeService()

{

return null;

}

2.租用管理器

租用管理器是服务器端专门用来管理远程对象生命周期的管理器,它维持着一个System.Hashtable成员,将租用映射为System.DateTime实例,表示每个租用何时应过期。Remoting采用轮询的方式以一定的时间唤醒租用管理器,检查每个租用是否过期。默认为每10s唤醒一次。轮询的间隔可以配置,如将轮询间隔设置为5min,代码如下:

LifetimeService.LeaseManagerPollTime = System.TimeSpan.FromMinutes(5);

在租用管理器中设置远程对象租用的属性,如改变远程对象的初始有效时间为永久有效,代码如下:

LifetimeServices.LeaseTime = TimeSpan.Zero;

通过配置文件来设置生命周期,代码如下:










If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759