Exemplo n.º 1
0
        protected virtual void QueryStorage()
        {
            _lastQueryTimeUtc            = DateTime.UtcNow;
            _isLastQueryMaxItemsReceived = false;

            Stopwatch storageQueryTimer = Stopwatch.StartNew();

            List <SignalEvent <TKey> > items = null;

            try
            {
                items = _eventQueries
                        .Find(ItemsQueryCount, MaxFailedAttempts)
                        .Result;
            }
            catch (Exception ex)
            {
                items = new List <SignalEvent <TKey> >();
                _logger.LogError(ex, SenderInternalMessages.DatabaseEventProvider_DatabaseError);
            }

            _monitor.EventPersistentStorageQueried(storageQueryTimer.Elapsed, items);

            _isLastQueryMaxItemsReceived = items.Count == ItemsQueryCount;
            if (_changeNotifier != null && _isLastQueryMaxItemsReceived == false)
            {
                _changeNotifier.StartMonitor();
            }

            _eventQueue.Append(items, true);
        }
        //cache
        protected virtual async Task <TotalResult <List <DispatchTemplate <TKey> > > > GetFromCacheOrFetch()
        {
            if (_cache != null &&
                (_changeNotifier == null || _changeNotifier.HasUpdates == false))
            {
                return(_cache);
            }

            TotalResult <List <DispatchTemplate <TKey> > > allItems = await _storageQueries.SelectPage(0, int.MaxValue)
                                                                      .ConfigureAwait(false);

            _cache = allItems;
            if (_changeNotifier != null)
            {
                _changeNotifier.StartMonitor();
            }

            return(allItems);
        }
        protected virtual void QueryStorage(List <int> activeDeliveryTypes)
        {
            //update query state
            _lastQueryTimeUtc            = DateTime.UtcNow;
            _lastQueryKeys               = activeDeliveryTypes;
            _isLastQueryMaxItemsReceived = false;

            //query items
            Stopwatch storageQueryTimer = Stopwatch.StartNew();
            DateTime  lockStartUtc      = DateTime.UtcNow;

            List <SignalDispatch <TKey> > items = null;

            try
            {
                items = PickStorageQuery(activeDeliveryTypes);
            }
            catch (Exception ex)
            {
                items = new List <SignalDispatch <TKey> >();
                _logger.LogError(ex, SenderInternalMessages.DatabaseDispatchProvider_DatabaseError);
            }
            storageQueryTimer.Stop();

            //enqueue items for processing
            _dispatchQueue.Append(items, true);

            //turn on database event tracking
            _isLastQueryMaxItemsReceived = items.Count == ItemsQueryCount;
            if (_changeNotifier != null && _isLastQueryMaxItemsReceived == false)
            {
                _changeNotifier.StartMonitor();
            }

            //store metrics
            _monitor.DispatchPersistentStorageQueried(storageQueryTimer.Elapsed, items);

            //remember processed items, not to query them again while processing
            _lockTracker.RememberLock(items.Select(x => x.SignalDispatchId), lockStartUtc);
        }