生存周期主要是针对Singleton模式和客户端激活模式。生存周期是采用租约的形式来管理。换句话说,客户端需要调用远程对象就是来租用远程对象,当租约到期后,远程对象就会被垃圾回收器立即销毁。当远程对象被实例化的时候,就会产生一份租约。租约内容如下:
InitialLeaseTime:初始化有效时间,默认值为300秒,如果为0,表示永不过期;
RenewOnCallTime:调用远程对象一个方法时的租用更新时间,默认值为120秒;
SponsorshipTimeout:超时值,通知Sponsor(发起人)租用过期后,Remoting会等待的时间,默认值为120秒;
代码修改默认租约信息的代码事例如下:
public override Object InitializeLifetimeService()
{
ILease lease = (ILease)base.InitializeLifetimeService();
if (lease.CurrentState == LeaseState.Initial)
{
lease.InitialLeaseTime = TimeSpan.FromSeconds(3);
lease.SponsorshipTimeout = TimeSpan.FromSeconds(10);
lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
}
return lease;
}
配置文件事例如下:
<lifetime leaseTime="3S" sponsorshipTimeout="10S" renewOnCallTime="2S" leaseManagerPollTime="10"/>
如果,客户端需要继续租用远程对象就需要续约。续约主要有三种方法:
Ø 隐式续约
直接调用远程对象方法。其实这个不难理解。服务器端之所以要设置生存周期的目的就是为了解决当客户端出现非正常退出,没有通知服务器端而造成服务器端的系统资源被占用。
Ø 显式续约
客户端不能为了续约,而无故去调用远程对象方法。远程对象也不应该写一个专门让客户端调用的方法,这非常不符合面向对象,不能真正体现对象的特性。因此,这时就需要通过显式续约。
代码事例如下:
ILease lease = (ILease)obj.GetLifetimeService();
if (lease != null)
{
TimeSpan expireTime = lease.Renew(TimeSpan.FromSeconds(15));
processResultTextBox.Text += expireTime.ToString() + Environment.NewLine;
}
Ø 发起者续约
针对客户端激活模式,.NET Remoting还提供一种发起者续约。其实这个非常容易理解,因为是客户端发起来激活远程对象,自然可能通过发起者续期来延长租约。
代码事例如下:
ClientSponsor sponsors = new ClientSponsor();
sponsors.RenewalTime = TimeSpan.FromSeconds(20);
sponsors.Register(calculator);
服务器端和客户端配置文件中的Channel节点增加如下配置:
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</serverProviders>
浙公网安备 33010602011771号