使用 JointCode.Shuttle 管理远程服务对象的生命期
2017-07-20 13:51
274 查看
JointCode.Shuttle 是一个用于进程内 AppDomain 间通信的服务架构(不支持跨进程),它旨在取代运行时库提供的 MarshalByrefObject 的功能。
一般情况下,在进行跨 AppDomain 调用时,大部分人选择使用运行时库默认提供的、基于 MarshalByrefObject 类继承的通信机制。代码也很简单,例如:
使用这种方式来调用远程(位于其他 AppDomain 的)服务,简单固然简单,但它不提供远程服务管理功能。也就是说,调用者无法控制何时释放远程服务对象。
假如远程服务对象只是提供简单的服务,这本来也没什么问题。但如果远程服务可能会被频繁调用呢?又或者远程服务持有关键系统资源(因而需要及时释放)呢?
前一种情况可能会造成服务端内存消耗增加,而后一种情况则可能造成系统瓶颈。
使用 JointCode.Shuttle 可以避免上述情况的发生,因为它允许客户端自主释放远程服务对象,或者也可以使用租约来管理远程对象的生命期。而且,如果远程对象实现了 IDisposable 接口,则其 Dispose 方法还会被调用(注意,如果服务被定义为单例,即在对服务类应用 ServiceClassAttribute 时将其 Lifetime 属性设为 LifetimeEnum.Singleton,则要到应用程序结束时才会释放其服务实例并调用其 Dispose 方法)。
使用方法类似如下所示:
我们为此编写了一个简单的测试,以下是测试结果的部分截图:
如需获取完整的测试源码,请移步前往 此处 下载(测试名称:ShuttleDomain生命期管理)。
一般情况下,在进行跨 AppDomain 调用时,大部分人选择使用运行时库默认提供的、基于 MarshalByrefObject 类继承的通信机制。代码也很简单,例如:
1 namespace JoitCode.Shuttle.SimpleSample 2 { 3 public class MyService : MarshalByRefObject 4 { 5 public void Do() { } 6 } 7 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 // 在默认 AppDomain 中创建一个子 AppDomain 13 var serviceDomain = AppDomain.CreateDomain("ServiceDomain", null, null); 14 15 var myService = (MyService)serviceDomain.CreateInstanceAndUnwrap 16 (typeof(MyService).Assembly.FullName, 17 "JoitCode.Shuttle.SimpleSample.MyService"); 18 19 myService.Do(); 20 21 Console.Read(); 22 } 23 } 24 }
使用这种方式来调用远程(位于其他 AppDomain 的)服务,简单固然简单,但它不提供远程服务管理功能。也就是说,调用者无法控制何时释放远程服务对象。
假如远程服务对象只是提供简单的服务,这本来也没什么问题。但如果远程服务可能会被频繁调用呢?又或者远程服务持有关键系统资源(因而需要及时释放)呢?
前一种情况可能会造成服务端内存消耗增加,而后一种情况则可能造成系统瓶颈。
使用 JointCode.Shuttle 可以避免上述情况的发生,因为它允许客户端自主释放远程服务对象,或者也可以使用租约来管理远程对象的生命期。而且,如果远程对象实现了 IDisposable 接口,则其 Dispose 方法还会被调用(注意,如果服务被定义为单例,即在对服务类应用 ServiceClassAttribute 时将其 Lifetime 属性设为 LifetimeEnum.Singleton,则要到应用程序结束时才会释放其服务实例并调用其 Dispose 方法)。
使用方法类似如下所示:
IRemoteLifetimeService lifetimeService; // 获取远程服务实例 // _shuttleDomain 是一个 ShuttleDomain 实例对象 _shuttleDomain.TryGetService(out lifetimeService); // 调用远程服务方法 lifetimeService.Execute(); // 远程服务对象会被释放 lifetimeService.Dispose();
我们为此编写了一个简单的测试,以下是测试结果的部分截图:
如需获取完整的测试源码,请移步前往 此处 下载(测试名称:ShuttleDomain生命期管理)。
相关文章推荐
- 使用 JointCode.Shuttle 访问任意 AppDomain 的服务
- 使用 JointCode.Shuttle 动态注册 / 注销服务
- 使用ssh服务管理远程主机
- RHEL4- SAMBA服务(八)使用swat轻松远程配置、管理smba服务器 推荐
- JointCode.Shuttle,一个简单高效的跨 AppDomain 通信的服务框架
- 使用 JointCode.Shuttle 提高跨 AppDomain 通信的性能
- 第9章 使用ssh服务管理远程主机。
- 使用 JointCode.Shuttle 进行跨 AppDomain 通信的一个简单示例
- 使用ssh服务管理远程主机
- Spring Framework 开发参考手册 之十六 通过Spring使用远程访问和web服务
- symbian中活动服务对象的一些简单的使用
- 今天使用sQL2005中Try_catch,以及分布式使用远程服务的函数
- VB.NET中使用SQL Server分布式管理对象(SQL-DMO)
- 【原创】远程管理linux系统---telnet服务
- 【原创】远程管理linux系统---ssh服务
- 使用 .NET 远程处理访问其他应用程序域中的对象
- 对象池(对象缓冲池)--采用最近最久未使用策略管理对象,同时带有事件监听功能
- 使用终端服务 实现网络远程连接
- 使用 Visual C# .NET 按值将对象封送到远程服务器