关于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值