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 static void LastIdUpdateThread()
        {
            var hsvc = new SignalRHostStateServiceProxy();
            SignalRHostStateSet set = new SignalRHostStateSet();

            try
            {
                evt.Set();
                while (true)
                {
                    Thread.Sleep(1000 * config.HostStateUpdateIntervalInSeconds);
                    if (IsLastMessageIdChanged)
                    {
                        SignalRHostState host = new SignalRHostState
                        {
                            IsPersisted         = true,
                            HostName            = config.HostName,
                            ApplicationID       = config.App.ID,
                            LastMsgId           = (long)LastMessageId,
                            IsLastMsgIdModified = true
                        };
                        try
                        {
                            hsvc.AddOrUpdateEntities(Cntx, set, new SignalRHostState[] { host });
                            IsLastMessageIdChanged = false;
                        }
                        catch
                        {
                        }
                    }
                }
            }
            finally
            {
                LastMessageIdUpdateThread = null;
            }
        }
 private static void KeepAliveThread()
 {
     SignalRHostStateSet set = new SignalRHostStateSet();
     try
     {
         evt.Set();
         int failCount = 0;
         var cntx = Cntx;
         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;
         }
         while (true)
         {
             Thread.Sleep(1000 * config.HostStateUpdateIntervalInSeconds);
             hsvc = new SignalRHostStateServiceProxy();
             if (IsLastMessageIdChanged)
             {
                 host = new SignalRHostState
                 {
                     IsPersisted = true,
                     HostName = config.HostName,
                     ApplicationID = config.App.ID,
                     LastMsgId = (long)LastMessageId,
                     IsLastMsgIdModified = true
                 };
                 try
                 {
                     hsvc.AddOrUpdateEntities(cntx, set, new SignalRHostState[] { host });
                     IsLastMessageIdChanged = false;
                     if (failCount > 0)
                     {
                         Current.Subscribe();
                         failCount = 0;
                     }
                 }
                 catch
                 {
                     failCount++;
                 }
             }
             else
             {
                 try
                 {
                     bool b = Current.PollMessages(cntx, LastMessageId);
                     if (b || (Current.lastSent - Current.lastReceived) > TimeSpan.FromSeconds(20) || failCount > 0)
                     {
                         Current.Subscribe();
                         failCount = 0;
                     }
                 }
                 catch
                 {
                     failCount++;
                 }
             }
             if (Current.CallbackFailed)
             {
                 try
                 {
                     Current.Subscribe();
                     failCount = 0;
                 }
                 catch
                 {
                     failCount++;
                 }
             }
         }
     }
     finally
     {
         LastMessageIdUpdateThread = null;
     }
 }
        private static void KeepAliveThread()
        {
            SignalRHostStateSet set = new SignalRHostStateSet();

            try
            {
                evt.Set();
                int failCount = 0;
                var cntx      = Cntx;
                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;
                }
                while (true)
                {
                    Thread.Sleep(1000 * config.HostStateUpdateIntervalInSeconds);
                    hsvc = new SignalRHostStateServiceProxy();
                    if (IsLastMessageIdChanged)
                    {
                        host = new SignalRHostState
                        {
                            IsPersisted         = true,
                            HostName            = config.HostName,
                            ApplicationID       = config.App.ID,
                            LastMsgId           = (long)LastMessageId,
                            IsLastMsgIdModified = true
                        };
                        try
                        {
                            hsvc.AddOrUpdateEntities(cntx, set, new SignalRHostState[] { host });
                            IsLastMessageIdChanged = false;
                            if (failCount > 0)
                            {
                                Current.Subscribe();
                                failCount = 0;
                            }
                        }
                        catch
                        {
                            failCount++;
                        }
                    }
                    else
                    {
                        try
                        {
                            bool b = Current.PollMessages(cntx, LastMessageId);
                            if (b || (Current.lastSent - Current.lastReceived) > TimeSpan.FromSeconds(20) || failCount > 0)
                            {
                                Current.Subscribe();
                                failCount = 0;
                            }
                        }
                        catch
                        {
                            failCount++;
                        }
                    }
                    if (Current.CallbackFailed)
                    {
                        try
                        {
                            Current.Subscribe();
                            failCount = 0;
                        }
                        catch
                        {
                            failCount++;
                        }
                    }
                }
            }
            finally
            {
                LastMessageIdUpdateThread = null;
            }
        }