public static Poller GetPoller(string sourceDirectory, string fileFilter, FileEnumeratingBasicFileController controller)
            {
                lock (Pollers)
                {
                    Poller p = Pollers.FirstOrDefault(i => i.SourceDirectory.Equals(sourceDirectory, StringComparison.InvariantCultureIgnoreCase) && i.FileFilter.Equals(fileFilter, StringComparison.InvariantCultureIgnoreCase));

                    if (p == null)
                    {
                        p = new Poller();
                        p.SourceDirectory = sourceDirectory;
                        p.FileFilter      = fileFilter;
                        p.Files           = new Dictionary <string, long>(StringComparer.InvariantCultureIgnoreCase);

                        p._References.Add(controller);

                        _PollerPool.BeginAsync(p);

                        Pollers.Add(p);
                    }

                    if (!p._References.Contains(controller))
                    {
                        p._References.Add(controller);
                    }

                    return(p);
                }
            }
示例#2
0
        public void Configuration(IAppBuilder app)
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion <ReadWriteDataContext, Configuration>());
            using (var c = new ReadWriteDataContext())
                c.Database.Initialize(true);

            GlobalConfiguration.Configuration.UseSqlServerStorage(ReadWriteDataContext.READ_WRITE_CONNECTION_STRING_NAME, new SqlServerStorageOptions
            {
                JobExpirationCheckInterval = TimeSpan.FromMinutes(5)
            });


            if (Utils.GlobalConfiguration.EnableHangfire)
            {
                Pollers.StartPolling();

                app.UseHangfireServer();

                var options = new DashboardOptions
                {
                    AppPath = VirtualPathUtility.ToAbsolute("~"),
                    AuthorizationFilters = new[] { new RemoveAuthorizationFilter() }
                };
                app.UseHangfireDashboard("/hangfire", options);
                GlobalJobFilters.Filters.Add(new ImmediatelyExpireSuccessfulJobs());
            }
        }
        public static void GetRecentCloseVoteReviews()
        {
            var closeVoteReviews = SEDataScraper.GetRecentCloseVoteReviews();

            using (var con = ReadWriteDataContext.PlainConnection())
            {
                using (var trans = con.BeginTransaction())
                {
                    foreach (var closeVote in closeVoteReviews)
                    {
                        //If the question doesn't exist, insert a blank row (we will queue it for scraping later)
                        con.Execute(@"
IF NOT EXISTS (SELECT NULL FROM Questions with (XLOCK, ROWLOCK) WHERE Id = @questionId)
BEGIN
    INSERT INTO Questions(Id, Closed, LastUpdated, Deleted, DeleteVotes, UndeleteVotes, ReopenVotes, LastTimeActive, ReviewId) 
        VALUES (@questionId, 0, GETUTCDATE(), 0, 0, 0, 0, GETUTCDATE(), @reviewId)
END
ELSE
BEGIN
    UPDATE Questions SET ReviewId = @reviewId WHERE Id = @questionId
END
", new { questionId = closeVote.Key, reviewId = closeVote.Value }, trans);
                    }

                    trans.Commit();
                }
            }
            Pollers.QueueQuestionQueries(closeVoteReviews.Keys);
        }
示例#4
0
        public static void QueryQuestionAndLogRequest(int userId, int questionId, string fullMessage)
        {
            Pollers.QueueQuestionQuery(questionId);

            using (var connection = ReadWriteDataContext.PlainConnection())
                connection.Execute(UPSERT_CVPLS_SQL, new { UserId = userId, QuestionId = questionId, FullMessage = fullMessage });
        }
        public ActionResult RefreshQuestionIds(List <int> questionIds)
        {
            foreach (var questionId in questionIds)
            {
                Pollers.QueueQuestionQuery(questionId);
            }

            return(new HttpStatusCodeResult(HttpStatusCode.NoContent));
        }
示例#6
0
        public ActionResult Poll(IList <int> questionIds)
        {
            Logger.LogInfo($"Polling questions: {string.Join(",", questionIds)}");
            foreach (var questionId in questionIds)
            {
                Pollers.QueueQuestionQuery(questionId, null, true);
            }

            return(new HttpStatusCodeResult(HttpStatusCode.NoContent));
        }
        protected override void DoWork(double pollinterval)
        {
            ConcurrentDictionary <string, bool> bag;

            if (!PollIntervals.TryGetValue(pollinterval, out bag))
            {
                return;
            }

            BetfairServerResponse <List <MarketBook> > book;

            try
            {
                book = _client.ListMarketBook(bag.Keys, _priceProjection, _orderProjection, _matchProjection).Result;
            }
            catch (AggregateException ex)
            {
                foreach (var e in ex.Flatten().InnerExceptions)
                {
                    _logger.Invoke(e, $"pollInterval {pollinterval}");
                }

                return;
            }

            if (book.HasError)
            {
                foreach (var observer in Observers.Where(k => bag.Keys.Contains(k.Key)))
                {
                    observer.Value.OnError(book.Error);
                }
                return;
            }

            // we may have fresher data than the response to this pollinterval request
            Poller p;

            if (!Pollers.TryGetValue(pollinterval, out p))
            {
                return;
            }

            if (book.RequestStart < p.LatestDataRequestStart && book.LastByte > p.LatestDataRequestFinish)
            {
                return;
            }

            lock (LockObj)
            {
                p.LatestDataRequestStart  = book.RequestStart;
                p.LatestDataRequestFinish = book.LastByte;
            }

            UpdateObservers(book.Response);
        }
            protected override void Dispose(bool dispose)
            {
                lock (Pollers)
                {
                    if (Pollers.Contains(this))
                    {
                        Pollers.Remove(this);
                    }
                }

                base.Dispose(dispose);
            }
 public ActionResult EnqueueAndRedirectReview(int reviewId)
 {
     new Thread(() =>
     {
         using (var con = ReadWriteDataContext.PlainConnection())
         {
             var questionId = con.Query <int?>("SELECT Id from QUESTIONS Where ReviewID = @reviewId", new { reviewId = reviewId }).FirstOrDefault();
             if (questionId != null)
             {
                 Pollers.QueueQuestionQuery(questionId.Value);
             }
         }
     }).Start();
     return(Redirect($"http://stackoverflow.com/review/close/{reviewId}"));
 }
示例#10
0
        public static void CheckCVPls()
        {
            using (var ctx = new ReadWriteDataContext())
            {
                var weekAgo            = DateTime.Now.ToUniversalTime().AddDays(-7);
                var questionIdsToCheck =
                    ctx.CVPlsRequests
                    .Where(r => !r.Question.Closed && r.CreatedAt >= weekAgo)
                    .Select(r => r.QuestionId)
                    .ToList();

                foreach (var questionId in questionIdsToCheck)
                {
                    Pollers.QueueQuestionQuery(questionId);
                }
            }
        }
            public void Dispose(FileEnumeratingBasicFileController controller)
            {
                lock (Pollers)
                {
                    if (_References.Contains(controller))
                    {
                        _References.Remove(controller);
                    }

                    if (_References.Count == 0)
                    {
                        Dispose();

                        if (Pollers.Contains(this))
                        {
                            Pollers.Remove(this);
                        }
                    }
                }
            }
 public ActionResult EnqueueAndRedirect(int questionId)
 {
     new Thread(() => Pollers.QueueQuestionQuery(questionId)).Start();
     return(Redirect($"http://stackoverflow.com/q/{questionId}"));
 }
示例#13
0
 public ActionResult PollQuestion(int questionId)
 {
     Pollers.QueueQuestionQuery(questionId, TimeSpan.FromMinutes(2), true);
     return(new HttpStatusCodeResult(HttpStatusCode.NoContent));
 }
示例#14
0
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);

            Pollers.StartPolling();
        }