/// <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) { }