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;
 }