Remoting方面的转帖1
前言:随着对Remoting的逐渐深入学习,觉得Remoting技术真是博大精深,很多内容对于我来说均是全新的知识。自知技术造诣浅陋,唯有以勤补拙。我很希望自己能写一些有用的文章,一方面记录自己的足迹,另一方面也能为别人提供某些帮助。然后,我在想,将文章命名为专题系列是否有些大了?也许吧,不过我总认为,目标不妨订高一些,压力不妨给自己多一些,也许努力下去,会有水到渠成的时候。
一、远程对象的激活
在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成。工作过程事实上是将该远程对象注册到通道中。由于Remoting没有提供与之对应的Unregister方法来注销远程对象,所以如果需要注册/注销指定对象,微软推荐使用Marshal(一般译为编组)和Disconnect配对使用。在《Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇》中我已经谈到:Marshal()方法是将MarshalByRefObject类对象转化为ObjRef类对象,这个对象是存储生成代理以与远程对象通讯所需的所有相关信息。这样就可以将该实例序列化以便在应用程序域之间以及通过网络进行传输,客户端就可以调用了。而Disconnect()方法则将具体的实例对象从通道中断开。
根据上述说明,Marshal()方法对远程对象以引用方式进行编组(Marshal-by-Reference,MBR),并将对象的代理信息放到通道中。客户端可以通过Activator.GetObject()来获取。如果用户要注销该对象,则通过调用Disconnect()方法。那么这种方式对于编组的远程对象是否存在生命周期的管理呢?这就是本文所要描述的问题。
二、生命周期
在CLR中,框架提供了GC(垃圾回收器)来管理内存中对象的生命周期。同样的,.Net Remoting使用了一种分布式垃圾回收,基于租用的形式来管理远程对象的生命周期。
早期的DCOM对于对象生命周期的管理是通过ping和引用计数来确定对象何时应当作为垃圾回收。然而ping引起的网络流量对分布式应用程序的性能是一种痛苦的负担,它大大地影响了分布式处理的整体性能。.Net Remoting在每个应用程序域中都引入一个租用管理器,为每个服务器端的SingleTon,或每个客户端激活的远程对象保存着对租用对象的引用。(说明:对于服务器端激活的SingleCall方式,由于它是无状态的,对于每个激活的远程对象,都由CLR的GC来自动回收,因此对于SingleCall模式激活的远程对象,不存在生命周期的管理。)
1、租用
租用是个封装了TimeSpan值的对象,用以管理远程对象的生存期。在.Net Remoting中提供了定义租用功能的ILease接口。当Remoting通过SingleTon模式或客户端激活模式来激活远程对象时,租用对象调用从System.MarshalByRefObject继承的InitializeLifetimeService方法,向对象请求租用。
ILease接口定义了有关生命周期的属性,均为TimeSpan值。如下:
InitialLeaseTime:初始化有效时间,默认值为300秒,如果为0,表示永不过期;
RenewOnCallTime:调用远程对象一个方法时的租用更新时间,默认值为120秒;
SponsorshipTimeout:超时值,通知Sponsor(发起人)租用过期后,Remoting会等待的时间,默认值为120秒;
CurrentLeaseTime:当前租用时间,首次获得租用时,为InitializeLeaseTime的值。
Remoting的远程对象因为继承了MarshalByRefObject,因此默认继承了InitializeLifetimeService方法,那么租用的相关属性为默认值。如果要改变这些设置,可以在远程对象中重写该方法。例如:
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采用轮询的方式以一定的时间唤醒租用管理器,检查每个租用是否过期。默认为每10秒钟唤醒一次。轮询的间隔可以配置,如将轮询间隔设置为5分钟:
LifetimeService.LeaseManagerPollTime = System.TimeSpan.FromMinutes(5);
我们还可以在租用管理器中设置远程对象租用的属性,如改变远程对象的初始有效时间为永久有效:
LifetimeServices.LeaseTime = TimeSpan.Zero;
我们也可以通过配置文件来设置生命周期,如:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application name = "SimpleServer">
<lifetime leaseTime = "0" sponsorshipTimeOut = "1M"
renewOnCallTime = "1M" pollTime = "30S"/>
</application>
</system.runtime.remoting>
</configuration>
注:配置文件中的pollTime即为上面所说的租用管理器的轮询间隔时间LeaseManagerPollTime。
租用管理器对于生命周期的设置是针对服务器上所有的远程对象。当我们通过配置文件或租用管理器设置租用的属性时,所有远程对象的生命周期都遵循该设置,除非我们对于指定的远程对象通过重写InitializeLifetimeService方法,改变了相关配置。也就是说,远程对象的租用配置优先级高于服务器端配置。
3、发起人(Sponsor)
发起人是针对客户端而言的。远程对象就是发起人要租用的对象,发起人可以与服务器端签订租约,约定租用时间。一旦到期后,发起人还可以续租,就像现实生活中租方的契约,房东、租房者之间的关系一样。
在.Net Framework中的System.Runtime.Remoting.Lifetime命名空间中定义了ClientSponsor类,该类继承了System.MarshalByRefObject,并实现了ISponsor接口。ClientSponsor类的属性和方法,可以参考MSDN。
客户端要使用发起人机制,必须创建ClientSponsor类的一个实例。然后调用相关方法如Register()或Renewal()方法来注册远程对象或延长生命周期。如:
RemotingObject obj = new RemotingObject();
ClientSponsor sponsor = new ClientSponsor();
sponsor.RenewalTime = TimeSpan.FromMinutes(2);
sponsor.Register(obj);
续租时间也可以在ClientSponsor的构造函数中直接设置,如:
ClientSponsor sponsor = new ClientSponsor(TimeSpan.FromMinutes(2));
sponsor.Register(obj);
我们也可以自己编写Sponsor来管理发起人机制,这个类必须继承ClientSponsor并实现ISponsor接口。
转载于:https://www.cnblogs.com/cwfsoft/archive/2010/02/21/1670558.html
Remoting方面的转帖1相关推荐
- Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务
Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...
- web service 和 remoting 有什么区别
其实现的原理并没有本质的区别,在应用开发层面上有以下区别: 1.Remoting可以灵活的定义其所基于的协议,如果定义为HTTP,则与Web Service就没有什么区别了,一般都喜欢定义为TCP,这 ...
- matlab整型和浮点的区别,技术帖 | 心理学MATLAB初学者教程--简单数据类型介绍(逻辑型数据,整型/浮点型数据,字符型)......
1.2.1 什么是变量和变量名 变量这个词似乎在许多地方都有出现,在计算机中变量是指是一段有名字的连续存储空间(摘自百度百科),而这个所谓的名字就叫做变量名.举个例子说现在我们再MATLAB的命令窗口 ...
- 远程处理Remoting
日程 ?应用程序域 ?Remoting和原理 ?编程式和管理式配置实例 用应用程序域 操作系统和运行库环境通常会在应用程序间提供某种形式的隔离.例如,Microsoft Windows 使用进程来隔离 ...
- 转帖 javascript事件监听
原帖地址: http://www.cnblogs.com/AganCN/archive/2008/05/24/1206272.html 考虑这样的情形在IE浏览中处理,需要响应页面的按钮点击事件,有哪 ...
- CVPR 2019超全论文合集新鲜出炉!| 资源帖
整理 | 夕颜 出品 | AI科技大本营(ID: rgznai100) 实不相瞒,这是一个资源福利帖--CVPR 2019 接收论文超全合集! 此前关于 CVPR 2019 论文和合集出过不少,但是这 ...
- .NET Remoting中的通道注册
今天我的同事使用Remoting注册一个新通道.奇怪的是,通道始终无法注册,总是报告异常"该通道已被占用".我明白这个异常出现的原因,但不明白的是此时系统并未使用任何一个通道,为何 ...
- 用java爬取学校数据_Java爬取校内论坛新帖
Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...
- 用Remoting 实现一个文件传输组件
为了传送文件,用remoting 实现很简单容易,有工程源码和演示程序下载,是从我写的一个网络库的一个子模块:有注解,不加以文字说明了. /**//* 作者:S.F. blog:www.cnblogs ...
最新文章
- 计算机网络协议分层体系结构
- WeifenLuo.WinFormsUI.Docking
- C语言逻辑运算符 - C语言零基础入门教程
- C++中类成员函数作为多线程的入口
- 将一个输入流(InputStream)写入到一个文件中
- [渝粤教育] 中国地质大学 现代控制理论 复习题 (2)
- Image Pyramids
- python语言数值操作符_Python之组合数据类型、逻辑操作符、控制流语句、算术操作符...
- 算法设计与分析 (知识点总结)
- 【微信小程序】常用组件及基本使用详解
- 基于Struts2的网上书城(仿当当网)系统
- 第一台电子计算机诞生于1944,(),第一台数字电子计算机问世。A、1944年B、1945年C、1946年 - 众答网问答...
- Qt 实现PC端网易云音乐界面
- 屠龙勇士最后都变成了恶龙吗?是!不然你以为恶龙是哪来的?
- 店盈通:你肯定不知道,拼多多如何打造基础销量
- 领导艺术:如何留住员工的心
- 关于安装李沐深度学习d2l包报错的解决办法(保姆教程)
- java epson_无法与Epson POS打印机通信
- 如何成为ffmpeg开发者
- Adobe Premiere Pro 2020 入门教程(三)首选项和快捷键的设置
热门文章
- 请你简单介绍一下ArrayList和LinkedList的区别及大数据量情况下的插入效率对比
- springboot中的spring-session用mysql实现session共享实践
- php文件utf8编码转gbk编码格式,把phpwind utf8 转成 gbk 编码
- 填谷式无源pfc电路_有源PFC电路上各个元件的作用-安泰维修
- 常用API-2(字符串与数组)
- 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)
- linux下使用make指令生成程序时提示“XXX is up to date”问题的解决办法
- mysql linux 安装部署,linux之MySQL安装部署(示例代码)
- Git 常用命令记录
- 移植MT76x8 私有WIFI驱动V4.1.0.0到Openwrt 18.06所遇到的坑