正 文

消息与.Net Remoting的分布式处理架构


www.7dspace.com  更新日期:2005-11-25 6:37:33  七度空间


  我们还需要在Service类中定义发送Request消息的行为,通过它,才能使业务服务被RequestListener所侦听。

  public IMessageItemSequence SendRequest(string aServiceName,string aMessageName,IMessageItemSequence aMessageBody)
        ...{
            IMessage message = m_Factory.CreateMessage();
            message.SetMessageName(aMessageName);
            message.SetMessageID("");
            message.SetMessageBody(aMessageBody);

            IService service = FindService(aServiceName);
            IMessageItemSequence replyBody = m_Factory.CreateMessageItemSequence();
            if (service != null)
            ...{
                IMessage replyMessage = service.Execute(message);
                replyBody = replyMessage.GetMessageBody();               
            }
            else
            ...{               
                replyBody.SetValue("result","Failure");               
            }
            return replyBody;
        }

      注意SendRequest()方法的定义,其参数包括服务名,消息名和被发送的消息主体。而在实现中最关键的一点是FindService()方法。我们要查找的服务正是与之对应的RequestListener服务。不过,在此之前,我们还需要先将服务Marshal:

  public void Initialize()
        ...{                                       
            RemotingServices.Marshal(this.m_RequestListener,this.m_ServiceName +".RequestListener");
        }

  我们Marshal的对象,是业务服务中的Request服务对象m_RequestListener,这个对象在Service的构造函数中被实例化:

       m_RequestListener = new RequestListener(this);

      注意,在实例化的时候是将this作为IListenService对象传递给RequestListener。因此,此时被Marshal的服务对象,保留了业务服务本身即Service的指引。可以看出,在Service和RequestListener之间,采用了“双重委派”的机制。

      通过调用Initialize()方法,初始化了一个服务对象,其类型为RequestListener(或IService),其服务名为:Service的服务名 + ".RequestListener"。而该服务正是我们在SendRequest()方法中要查找的Service:

      IService service = FindService(aServiceName);

      下面我们来看看FindService()方法的实现:

  protected IService FindService(string aServiceName)
        ...{
            lock (this.m_Services)
            ...{
                IService service = (IService)m_Services[aServiceName];
                if (service != null)
                ...{
                    return service;
                }
                else
                ...{
                    IService tmpService = GetService(aServiceName);
                    AddService(aServiceName,tmpService);
                    return tmpService;
                }
            }
        }

      可以看到,这个服务是被添加到m_Service对象中,该对象为SortedList类型,服务名为Key,IService对象为Value。如果没有找到,则通过私有方法GetService()来获得:

  private IService GetService(string aServiceName)
        ...{

3页,页码:[1] [2] [3] 

上一篇:用QQ互动状态 通过临时会话与陌生人聊天
下一篇:巧妙解决Windows异常关机后的磁盘故障
作者:wayfarer  来源:博客堂 ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐