Esempio n. 1
0
        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));
            });
        }
Esempio n. 2
0
        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);
            }
        }