/// <summary>
        /// 订阅
        /// </summary>
        /// <param name="info"></param>
        /// <param name="sessionId"></param>
        public void Subscribe(SubscribeInformaction info, string sessionId)
        {
            var subscribe = Server.MessageStore.GetSubscribe(info.SubscribeId, info.Topic);
            var record    = new MessageSubscribeRecord()
            {
                CurrentSessionId = sessionId, SubscribeInformaction = info
            };

            if (subscribe == null)
            {
                //先查询是否存在同主题订阅,不存在则向消息队列订阅
                if (!Server.MessageStore.HasTopicSubscribe(info.Topic))
                {
                    Server.MessageQueue.Subscribe(info);
                }
                Server.MessageStore.SaveSubscribe(record);
            }
            else
            {
                Server.MessageStore.UpdateSubscribe(record);
            }
            //异步处理失败推送重试
            Task.Factory.StartNew((o) =>
            {
                var subscribeRecord = (MessageSubscribeRecord)o;
                RetryFailedSubscription(subscribeRecord.SubscribeInformaction, subscribeRecord.CurrentSessionId);
            }, record);
        }
        public bool SocketPubish(SubscribeInformaction subInfo, PubishInformaction pubInfo, string sessionId)
        {
            var session = Server.GetSessionByID(sessionId);

            if (session != null && session.Status == SessionStatus.Started && session.Connected)
            {
                try
                {
                    var topicBytes   = session.TextToBytes(pubInfo.Topic);
                    var contentBytes = session.TextToBytes(pubInfo.Content);
                    var lenBytes     = BitConverter.GetBytes(topicBytes.Length);

                    var body = new byte[topicBytes.Length + contentBytes.Length + 4];
                    Array.Copy(lenBytes, 0, body, 0, 4);
                    Array.Copy(topicBytes, 0, body, 4, topicBytes.Length);
                    Array.Copy(contentBytes, 0, body, 4 + topicBytes.Length, contentBytes.Length);
                    session.SendBytes(pulishRouteCode, body);
                    return(true);
                }
                catch (Exception)
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// 失败订阅重试
        /// </summary>
        /// <param name="info"></param>
        /// <param name="session"></param>
        private void RetryFailedSubscription(SubscribeInformaction info, string session)
        {
            var counter = 0;

            while (true)
            {
                var msg = Server.MessageStore.GetAndRemoveFailureRecord(info.SubscribeId, info.Topic);
                if (msg == null)
                {
                    return;
                }
                var isSuccess = SocketPubish(info, msg, session);

                if (!isSuccess && info.IsWebSiteSubscriber)
                {
                    WebPubish(info, msg);
                }
                counter++;
                if (counter > 500)
                {
                    counter = 0;
                    Thread.Sleep(100);//重试推送,防止CPU长时间占用
                }
            }
        }
 /// <summary>
 ///取消订阅
 /// </summary>
 /// <param name="info"></param>
 public void UnSubscribe(SubscribeInformaction info)
 {
     Server.MessageStore.RemoveSubscribe(info.SubscribeId, info.Topic);
     //删除后查询是否存在同主题订阅,不存在则向消息队列取消订阅
     if (!Server.MessageStore.HasTopicSubscribe(info.Topic))
     {
         Server.MessageQueue.Subscribe(info);
     }
 }
 public bool WebPubish(SubscribeInformaction subInfo, PubishInformaction pubInfo)
 {
     if (!subInfo.IsWebSiteSubscriber)
     {
         throw new Exception("Web推送不支持非Web应用!");
     }
     try
     {
         var url     = new Uri(new UriBuilder(subInfo.WebSiteURI).Uri, pulishWebRouteCode);
         var content = url.PostJson(pubInfo);
         return(true);
     }
     catch (Exception)
     {
         return(false);
     }
 }
        public void UnSubscribe(SubscribeInformaction info)
        {
            ISubscriber sub = Connection.GetSubscriber();

            sub.Unsubscribe(info.Topic, Handler);
        }
 public void UnSubscribe(SubscribeInformaction info)
 {
 }