当前位置: 首页 > news >正文

关于Remoting服务启动和停止的简单总结

        
      很长一段时间,哪里工作紧急,哪里需要帮助,我就得往哪冲。工作了N年时间,经历和很多事情,想明白了一些事情,心态也好了很多。我想不论在什么公司,不论做什么工作,我们都可以从中获取些东西,都有机会实现我们的价值,关键是心态。前几天刚解决了几个问题,这不又来了一个问题。


   公司有一个系统,使用
Remoting实现分布式通信。服务端用于管理远程服务,完成注册和注销等工作。因为对于服务端的控制要求并不是很高,所以以前在实现注册和注销功能时都需要重新启动服务端,从而重新加载最新的服务。如果是配置一次两次还不觉得什么,可是如果改动很多,特别是开发期间注册新的服务,则很不方便,需要重启N次服务端。于是,工作就来了:要求改造控制单个服务而不影响其他服务或者重新启动系统。
   
    

因为是针对每个服务的控制,不希望在控制一个服务的时候,影响其他的服务,所以在这里使用了RemotingServices.Disconnect,而没有使用注销信道的方法ChannelServices.UnregisterChannel

   

为了实现这个功能,定义了一个ServiceContainer类,有一个服务集合变量IDictionary<string,MarshalByRefObject> serviceObjectTable,用于缓存在服务端启动的服务对象。我还定义两个方法StartServiceStopService方法,实现分别如下:


     

ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
InBlock.gif        
/// 开启服务
InBlock.gif        
/// </summary>
ExpandedBlockEnd.gif        
/// <param name="serviceType"></param>

None.gif          public   void  StartService(System.Type serviceType)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            TypeReflect reflect 
= new TypeReflect();
InBlock.gif            ServiceAttribute sa 
= reflect.GetServiceAttribute<ServiceAttribute>(serviceType);
InBlock.gif
InBlock.gif            
if (sc != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                MarshalByRefObject serviceObj 
= System.Activator.CreateInstance(serviceType) as MarshalByRefObject;
InBlock.gif
InBlock.gif                
if (serviceObj != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
string key = serviceType.FullName + "_" + sa.Version;
InBlock.gif                    
if (serviceObjectTable.Keys.Contains(key) == false)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                         serviceObjectTable.Add(key, serviceObj);
InBlock.gif
InBlock.gif                         RemotingServices.Marshal(serviceObj, key);
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif
ExpandedBlockStart.gifContractedBlock.gif        
/**/ /// <summary>
InBlock.gif        
/// 停止服务
InBlock.gif        
/// </summary>
ExpandedBlockEnd.gif        
/// <param name="serviceType"></param>

None.gif          public   void  StopService(System.Type serviceType) 
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            TypeReflect reflect 
= new TypeReflect();
InBlock.gif            ServiceAttribute sa 
= reflect.GetServiceAttribute<ServiceAttribute>(serviceType);
InBlock.gif
InBlock.gif            
string key = serviceType.FullName + "_" + sa.Version;
InBlock.gif
InBlock.gif            
if (serviceObjectTable.Keys.Contains(key))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{                
InBlock.gif                RemotingServices.Disconnect(serviceObjectTable[key]);
InBlock.gif                serviceObjectTable.Remove(key);                 
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

    其实最主要的步骤就是  :
   启动:MarshalByRefObject   serviceObj   =   System.Activator.CreateInstance(serviceType)   as   MarshalByRefObject;
         RemotingServices.Marshal(serviceObj, key);

   停止:
        RemotingServices.Disconnect(_ServiceObjectTable[key]);

   
   好了,问题已经解决了。周末了,应该快乐一下。



      

转载于:https://www.cnblogs.com/yiping06993010/archive/2007/08/17/860004.html

相关文章:

  • 使用easyboot合并启动光盘完全图解教程
  • JIRA安装与破解
  • 利用open***+linux快速建立企业×××
  • 闲话网名之“思念狗的骨头”
  • 部署防火墙策略的十六条守则
  • Animation全接触
  • 公司中DIY与品牌机你会选择谁?
  • 改变你职场生涯的五个秘密
  • 警惕U盘病毒Windows.scr(ghost.pif新变种)
  • 被你遗忘掉的Windows快捷键
  • 网页中插入视频播放代码全集
  • ASP.NET 页面生存周期中的关键事件
  • 100部名著 每部名著浓缩一句[完整版] 转帖
  • Java语言4
  • RedHat AS 4安装详解
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 0x05 Python数据分析,Anaconda八斩刀
  • 77. Combinations
  • Android 控件背景颜色处理
  • Android开源项目规范总结
  • Docker入门(二) - Dockerfile
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • OSS Web直传 (文件图片)
  • React as a UI Runtime(五、列表)
  • Vue UI框架库开发介绍
  • 高度不固定时垂直居中
  • 关于Java中分层中遇到的一些问题
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 硬币翻转问题,区间操作
  • 正则表达式小结
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​​​​​​​​​​​​​​Γ函数
  • ​Python 3 新特性:类型注解
  • #Linux(权限管理)
  • #stm32整理(一)flash读写
  • (4)logging(日志模块)
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (图)IntelliTrace Tools 跟踪云端程序
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (译) 函数式 JS #1:简介
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .bat批处理(一):@echo off
  • [hive] 窗口函数 ROW_NUMBER()
  • [J2ME]如何替换Google Map静态地图自带的Marker