zoukankan      html  css  js  c++  java
  • ESFramework介绍之(27)-- 支持OverdueMessage

       (本文适用于ESFramework V0.2+)
         QQ上,你给好友发消息,如果对方不在线,则服务器会把这个消息持久化存起来,等好友下次上线时,再转发给他。像这样的消息在ESFramework中称为OverdueMessage。显然,MSN没有支持OverdueMessage。 当然了,ESFramework中的OverdueMessage不仅仅是文字消息,而是可以为任何类型的消息,比如,音频、视频、文件等等。

        ESFramework中对所有P2P的消息的处理都是由P2PMessageDealer完成的,当P2PMessageDealer转发一个消息时,发现目标用户不在线,就会将这个消息交给一个称为IOverdueMessageHandler的组件处理,IOverdueMessageHandler组件可以持久化存储这个消息,也可以直接将其保存在内存中,具体采用哪种方式,取决于你的应用。
        IOverdueMessageHandler组件有如下职责:
    (1)保存(或持久化)存储OverdueMessage
    (2)提取指定目标用户的所有OverdueMessage
    (3)当OverdueMessage成功发送给目标用户后,改变OverdueMessage的状态或删除这些OverdueMessage。

        基于此,IOverdueMessageHandler接口设计如下:

        public interface IOverdueMessageHandler
        {
            
    bool  Enabled{set ;}
            
    void  HandleOverdueP2PMessage(NetMessage revMsg) ; 
            IList PickupOverdueP2PMessage(string destUserID) ; //列表中为NetMessage元素
            void  SetOverdueMessageSended(string destUserID) ;
        }

        对应的类图:
        
        IOverdueMessageHandler由应用实现,因为只有你的应用需求才能决定处理OverdueMessage的物理方式。P2PMessageDealer的实现中引入了IOverdueMessageHandler,如下:

                int result = this.toClientSender.HookAndSendMessage(reqMsg.Header.DestUserID ,reqMsg) ;
                
    if(result != DataSendResult.Succeed) //处理没有发送成功的消息
                {
                    
    if(this.overdueMessageHandler != null)
                    {
                        
    this.overdueMessageHandler.HandleOverdueP2PMessage(reqMsg) ;
                    }
                }      
                
    //

        我们需要另外一个组件来负责发送OverdueMessage给目标用户,那就是OverdueMessageSender,它可以让你指定在多久之后发送OverdueMessage给指定的用户,如果没有指定这个时间间隔,就立即发送。
       

    OverdueMessageSender

        注意,OverdueMessageSender借助OverdueMessageHandler来取出指定目标用户的OverdueMessage,并借助IToClientSender组件来发送这些OverdueMessage,最后,当发送成功,就调用OverdueMessageHandler的SetOverdueMessageSended方法。

        很多应用都要求在目标用户登录时,将属于他的OverdueMessage发送给它,这个时机可以从IBasicRequestDealer组件的SomeOneLogon事件切入,ESFramework对这一常见需求进行了支持,那就是OverdueMessageBridge。OverdueMessageBridge将OverdueMessageSender链接到这一时机。
       

        public class OverdueMessageBridge
        {

            
    #region BasicRequestDealer        
            
    public IBasicRequestDealer BasicRequestDealer
            {
                
    set
                {
                    
    if(value != null)
                    {
                        value.SomeOneLogon 
    += new CbLogon(value_SomeOneLogon);
                    }                
                }
            }
            
    #endregion
            
            
    #region OverdueMessageSender
            
    private OverdueMessageSender overdueMessageSender = null ; 
            
    public  OverdueMessageSender OverdueMessageSender
            {
                
    set
                {
                    
    this.overdueMessageSender = value ;
                }
            }
            
    #endregion

            
    public OverdueMessageBridge()
            {            
            }

            
    private void value_SomeOneLogon(string userID, NetMessage logonMsg)
            {
                
    this.overdueMessageSender.SendOverdueMessage(userID) ;
            }
        }

        如果你需要在其它时刻来发送OverdueMessage,自己构造一个对应的Bridge即可。

        细心的朋友可能会问,如果使用了Hook,那么Hook会不会对IOverdueMessageHandler.PickupOverdueP2PMessage()取出的消息产生影响?答案是不会。因为OverdueMessageSender采用的是和P2PMessageDealer一样的方式来发送OverdueMessage,所以如果存在Hook,OverdueMessage也会经过相同的Hook处理。

        (ESFramework V0.2 将会在五一假期后上载)

    感谢关注!

    上一篇文章:ESFramework介绍之(26)-- 支持复杂插件(InnerDealer 和 InnerDispatcher)

    转到  :ESFramework 可复用的通信框架(序) 







  • 相关阅读:
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    205. Isomorphic Strings
    204. Count Primes
    203. Remove Linked List Elements
    201. Bitwise AND of Numbers Range
    199. Binary Tree Right Side View
    ArcGIS API for JavaScript 4.2学习笔记[8] 2D与3D视图同步
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/389598.html
Copyright © 2011-2022 走看看