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