zoukankan      html  css  js  c++  java
  • 使用 JointCode.Shuttle 管理远程服务对象的生命期

    JointCode.Shuttle 是一个用于进程内 AppDomain 间通信的服务架构(不支持跨进程),它旨在取代运行时库提供的 MarshalByrefObject 的功能。

     一般情况下,在进行跨 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生命期管理

    如需获取完整的测试源码,请移步前往 此处 下载(测试名称:ShuttleDomain生命期管理)。

  • 相关阅读:
    鉴权系统的梳理及并发问题的考虑
    分布式事物解决选择
    电商平台客服和商铺的数据表设计( 初稿记录)43
    问题整理
    关于
    问题整理
    问题整理(常问3连)
    问题整理
    强引用、软引用、弱引用、幻象引用的区别
    通过aop获取切面方法请求入参名称和值的json打印
  • 原文地址:https://www.cnblogs.com/johnny-liu/p/7200053.html
Copyright © 2011-2022 走看看