public async Task DequeueAsync(Func <IQueueItem <T>, Task <bool> > processor) { _logger.LogTrace("LargeMessageQueue<T>: DequeueAsync - attempting dequeue"); await _referenceQueue.DequeueAsync(async message => { if (message != null) { _logger.LogTrace("LargeMessageQueue<T>: DequeueAsync - dequeued large message with blob reference {BLOBREFERENCE}", message.Item.BlobReference); IBlob blob; T item; try { blob = _blobRepository.Get(message.Item.BlobReference); var serializedObjectText = await blob.DownloadStringAsync(Encoding.UTF8); await _referenceQueue.ExtendLeaseAsync(message); item = _serializer.Deserialize <T>(serializedObjectText); await _referenceQueue.ExtendLeaseAsync(message); } catch (Exception ex) { _logger.LogTrace("LargeMessageQueue<T>: DequeueAsync - unable to download blob {BLOBREFERENCE}", message.Item.BlobReference); if (_errorHandler != null) { return(await _errorHandler.UnableToDownloadBlobAsync(ex, message)); } throw new LargeMessageQueueException("Unable to download blob", ex, message); } bool result = await processor(new LargeMessageQueueItem <T>(item, message.DequeueCount, message)); if (result) { try { _logger.LogTrace("LargeMessageQueue<T>: DequeueAsync - deleting blob reference {BLOBREFERENCE}", message.Item.BlobReference); await _referenceQueue.ExtendLeaseAsync(message); await blob.DeleteAsync(); } catch (Exception ex) { _logger.LogTrace("LargeMessageQueue<T>: DequeueAsync - unable to delete blob reference {BLOBREFERENCE}", message.Item.BlobReference); if (_errorHandler != null) { return(await _errorHandler.UnableToDeleteBlobAsync(ex, message)); } throw new LargeMessageQueueException("Unable to delete blob, abandoning queue item", ex, message); } } return(result); } return(await processor(null)); }); }
public async Task DequeueAsync(Func <IQueueItem <T>, Task <bool> > processor, TimeSpan?visibilityTimeout) { CloudQueueMessage message = await _queue.GetMessageAsync(visibilityTimeout, null, null); if (message != null) { _logger?.LogTrace("AsyncQueue: DequeueAsync - dequeued item from queue {QUEUENAME}", _queueName); T item = _serializer.Deserialize <T>(message.AsString); if (await processor(new CloudQueueItem <T>(message, item, message.DequeueCount, message.PopReceipt))) { _logger?.LogTrace("AsyncQueue: DequeueAsync - deleting item from queue {QUEUENAME}", _queueName); await _queue.DeleteMessageAsync(message); } else { _logger?.LogTrace("AsyncQueue: DequeueAsync - returnng item to queue {QUEUENAME}", _queueName); } } else { await processor(null); } }