protected override async Task <IQueueEntry <T> > DequeueImplAsync(CancellationToken linkedCancellationToken)
        {
            var message = await _queueReference.GetMessageAsync(_options.WorkItemTimeout, null, null).AnyContext();

            bool isTraceLogLevelEnabled = _logger.IsEnabled(LogLevel.Trace);

            if (message == null)
            {
                var sw         = Stopwatch.StartNew();
                var lastReport = DateTime.Now;
                if (isTraceLogLevelEnabled)
                {
                    _logger.LogTrace("No message available to dequeue, waiting...");
                }

                while (message == null && !linkedCancellationToken.IsCancellationRequested)
                {
                    if (isTraceLogLevelEnabled && DateTime.Now.Subtract(lastReport) > TimeSpan.FromSeconds(10))
                    {
                        _logger.LogTrace("Still waiting for message to dequeue: {Elapsed:g}", sw.Elapsed);
                    }

                    try {
                        if (!linkedCancellationToken.IsCancellationRequested)
                        {
                            await SystemClock.SleepAsync(_options.DequeueInterval, linkedCancellationToken).AnyContext();
                        }
                    } catch (OperationCanceledException) { }

                    message = await _queueReference.GetMessageAsync(_options.WorkItemTimeout, null, null).AnyContext();
                }

                sw.Stop();
                if (isTraceLogLevelEnabled)
                {
                    _logger.LogTrace("Waited to dequeue message: {Elapsed:g}", sw.Elapsed);
                }
            }

            if (message == null)
            {
                if (isTraceLogLevelEnabled)
                {
                    _logger.LogTrace("No message was dequeued.");
                }
                return(null);
            }

            if (isTraceLogLevelEnabled)
            {
                _logger.LogTrace("Dequeued message {Id}", message.Id);
            }
            Interlocked.Increment(ref _dequeuedCount);
            var data  = _serializer.Deserialize <T>(message.AsBytes);
            var entry = new AzureStorageQueueEntry <T>(message, data, this);

            await OnDequeuedAsync(entry).AnyContext();

            return(entry);
        }
예제 #2
0
        public override async Task <IQueueEntry <T> > DequeueAsync(CancellationToken cancellationToken)
        {
            // TODO: Use cancellation token overloads
            var linkedCancellationToken = CancellationTokenSource.CreateLinkedTokenSource(_queueDisposedCancellationTokenSource.Token, cancellationToken).Token;

            // TODO Pass linkedCancellationToken to GetMessageAsync once weird timeout issue is resolved.
            var message = await _queueReference.GetMessageAsync(_workItemTimeout, null, null).AnyContext();

            while (message == null && !linkedCancellationToken.IsCancellationRequested)
            {
                try {
                    await Task.Delay(_dequeueInterval, linkedCancellationToken);
                } catch (TaskCanceledException) { }

                // TODO Pass linkedCancellationToken to GetMessageAsync once weird timeout issue is resolved.
                message = await _queueReference.GetMessageAsync(_workItemTimeout, null, null).AnyContext();
            }

            if (message == null)
            {
                return(null);
            }

            Interlocked.Increment(ref _dequeuedCount);
            var data = await _serializer.DeserializeAsync <T>(message.AsBytes);

            var entry = new AzureStorageQueueEntry <T>(message, data, this);

            await OnDequeuedAsync(entry).AnyContext();

            return(entry);
        }
예제 #3
0
        protected override async Task <IQueueEntry <T> > DequeueImplAsync(CancellationToken linkedCancellationToken)
        {
            var message = await _queueReference.GetMessageAsync(_options.WorkItemTimeout, null, null).AnyContext();

            bool isTraceLogLevelEnabled = _logger.IsEnabled(LogLevel.Trace);

            if (isTraceLogLevelEnabled)
            {
                _logger.LogTrace("Initial message id: {Id}", message?.Id ?? "<null>");
            }

            while (message == null && !linkedCancellationToken.IsCancellationRequested)
            {
                if (isTraceLogLevelEnabled)
                {
                    _logger.LogTrace("Waiting to dequeue item...");
                }
                var sw = Stopwatch.StartNew();

                try {
                    if (!linkedCancellationToken.IsCancellationRequested)
                    {
                        await SystemClock.SleepAsync(_options.DequeueInterval, linkedCancellationToken).AnyContext();
                    }
                } catch (OperationCanceledException) { }

                sw.Stop();
                if (isTraceLogLevelEnabled)
                {
                    _logger.LogTrace("Waited for dequeue: {Elapsed:g}", sw.Elapsed);
                }

                message = await _queueReference.GetMessageAsync(_options.WorkItemTimeout, null, null).AnyContext();

                if (isTraceLogLevelEnabled)
                {
                    _logger.LogTrace("Message id: {Id}", message?.Id ?? "<null>");
                }
            }

            if (message == null)
            {
                return(null);
            }

            Interlocked.Increment(ref _dequeuedCount);
            var data  = _serializer.Deserialize <T>(message.AsBytes);
            var entry = new AzureStorageQueueEntry <T>(message, data, this);

            await OnDequeuedAsync(entry).AnyContext();

            return(entry);
        }