private void SendMessageThread(object obj) { CancellationToken ct = (CancellationToken)obj; IList <Message> msgs; var cntx = Cntx; var set = new SignalRMessageSet(); var msgsvc = new SignalRMessageServiceProxy(); while (!ct.IsCancellationRequested) { msgs = MessageQueue.Take(ct); if (msgs != null && !ct.IsCancellationRequested) { SignalRMessage entity = new SignalRMessage { ApplicationID = config.App.ID, TimeStamp = DateTime.UtcNow.Ticks, MesssageData = (new ScaleoutMessage(msgs)).ToBytes() }; try { msgsvc.AddOrUpdateEntities(cntx, set, new SignalRMessage[] { entity }); lastSent = DateTime.Now; } catch { } } } }
private bool PollMessages(CallContext cntx, ulong lastId) { var msgsvc = new SignalRMessageServiceProxy(); DateTime dt = DateTime.UtcNow.AddHours(-config.TimeWindowInHours); QueryExpresion qexpr = new QueryExpresion(); qexpr.OrderTks = new List <QToken>(new QToken[] { new QToken { TkName = "ID" }, new QToken { TkName = "desc" } }); qexpr.FilterTks = new List <QToken>(new QToken[] { new QToken { TkName = "ApplicationID == \"" + config.App.ID + "\" && ID > " + lastId + " && TimeStamp > " + dt.Ticks } }); var msgs = msgsvc.QueryDatabaseLimited(cntx, new SignalRMessageSet(), qexpr, config.MaxBacklogMessages).ToArray(); if (msgs.Length > 0) { LastMessageId = (ulong)msgs[0].ID; IsLastMessageIdChanged = true; foreach (var e in from d in msgs orderby d.ID ascending select d) { var smsg = ScaleoutMessage.FromBytes(e.MesssageData); forwardMessage((ulong)e.ID, smsg); } } return(msgs.Length > 0); }
private void ProcOldMessages(CallContext cntx, SignalRMessageServiceProxy msgsvc) { var hsvc = new SignalRHostStateServiceProxy(); var host = hsvc.LoadEntityByNature(cntx, config.HostName, config.App.ID).SingleOrDefault(); if (host == null) { host = new SignalRHostState { HostName = config.HostName, ApplicationID = config.App.ID, LastMsgId = 0 }; var x = hsvc.AddOrUpdateEntities(cntx, new SignalRHostStateSet(), new SignalRHostState[] { host }); host = x.ChangedEntities[0].UpdatedItem; } DateTime dt = DateTime.UtcNow.AddHours(-config.TimeWindowInHours); QueryExpresion qexpr = new QueryExpresion(); qexpr.OrderTks = new List <QToken>(new QToken[] { new QToken { TkName = "ID" }, new QToken { TkName = "desc" } }); qexpr.FilterTks = new List <QToken>(new QToken[] { new QToken { TkName = "ApplicationID == \"" + config.App.ID + "\" && ID > " + host.LastMsgId + " && TimeStamp > " + dt.Ticks } }); var msgs = msgsvc.QueryDatabaseLimited(cntx, new SignalRMessageSet(), qexpr, config.MaxBacklogMessages).ToArray(); if (msgs.Length > 0) { host.LastMsgId = msgs[0].ID; LastMessageId = (ulong)host.LastMsgId; IsLastMessageIdChanged = true; foreach (var e in from d in msgs orderby d.ID ascending select d) { OnReceived(0, (ulong)e.ID, ScaleoutMessage.FromBytes(e.MesssageData)); } } }
private void Initialize() { Initialized = false; var cntx = Cntx; var msgsvc = new SignalRMessageServiceProxy(); ProcOldMessages(cntx, msgsvc); string url = config.BackPlaneUrl; if (string.IsNullOrEmpty(url)) { url = msgsvc.Endpoint.Address.Uri.ToString(); url = url.Substring(0, url.IndexOf("/Services")); } var hubConn = new HubConnection(url); var hubProxy = hubConn.CreateHubProxy("NotificationHub"); hubConn.Start().Wait(); hubProxy.Invoke("JoinGroup", EntitySetType.SignalRMessage.ToString()).Wait(); hubProxy.On <dynamic>("entityChanged", (dmsg) => ProcMessage(cntx, dmsg)); MessageQueue = new BlockingCollection <IList <Message> >(new ConcurrentQueue <IList <Message> >(), config.MaxQueueLength); Task.Factory.StartNew(SendMessageThread); Initialized = true; }
private void SendMessageThread() { IList<Message> msgs; var cntx = Cntx; var set = new SignalRMessageSet(); var msgsvc = new SignalRMessageServiceProxy(); while (!CancelSendOperation.IsCancellationRequested) { msgs = MessageQueue.Take(CancelSendOperation); if (msgs != null && !CancelSendOperation.IsCancellationRequested) { SignalRMessage entity = new SignalRMessage { ApplicationID = config.App.ID, TimeStamp = DateTime.UtcNow.Ticks, MesssageData = (new ScaleoutMessage(msgs)).ToBytes() }; try { msgsvc.AddOrUpdateEntities(cntx, set, new SignalRMessage[] { entity }); lastSent = DateTime.Now; } catch { } } } }
private bool PollMessages(CallContext cntx, ulong lastId) { var msgsvc = new SignalRMessageServiceProxy(); DateTime dt = DateTime.UtcNow.AddHours(-config.TimeWindowInHours); QueryExpresion qexpr = new QueryExpresion(); qexpr.OrderTks = new List<QToken>(new QToken[] { new QToken { TkName = "ID" }, new QToken { TkName = "desc" } }); qexpr.FilterTks = new List<QToken>(new QToken[] { new QToken { TkName = "ApplicationID == \"" + config.App.ID + "\" && ID > " + lastId + " && TimeStamp > " + dt.Ticks } }); var msgs = msgsvc.QueryDatabaseLimited(cntx, new SignalRMessageSet(), qexpr, config.MaxBacklogMessages).ToArray(); if (msgs.Length > 0) { LastMessageId = (ulong)msgs[0].ID; IsLastMessageIdChanged = true; foreach (var e in from d in msgs orderby d.ID ascending select d) { var smsg = ScaleoutMessage.FromBytes(e.MesssageData); forwardMessage((ulong)e.ID, smsg); } } return msgs.Length > 0; }