示例#1
0
        public async Task <IEnumerable <AzureEmailQueueMessage> > ReceiveAsync(int number, CancellationToken cancellationToken)
        {
            _logger.LogTrace("Receiving {0} message(s)", number);

            if (!_initialized)
            {
                await InitializeAsync(cancellationToken);
            }

            if (number > MaxMessagesToRetrieve)
            {
                throw new ArgumentOutOfRangeException(nameof(number), $"The {GetType().Name} implementation of `IEmailQueueReceiver<TMessage>` can only dequeue up to {MaxMessagesToRetrieve} message(s) at a time");
            }

            if (number < 1)
            {
                throw new ArgumentOutOfRangeException(nameof(number), $"The parameter `number` of `IEmailQueueReceiver` must be a positive integer greater than or equal to one, as you can't retrieve zero messages or less");
            }

            var tokens = new List <AzureEmailQueueMessage>();

            foreach (var message in await _queue.Value.GetMessagesAsync(number, null, null, null, cancellationToken))
            {
                tokens.Add(new AzureEmailQueueMessage
                {
                    Token        = EmailQueueToken.DecodeBytes(message.AsBytes),
                    MessageId    = message.Id,
                    PopReceipt   = message.PopReceipt,
                    DequeueCount = message.DequeueCount
                });
            }

            return(tokens);
        }
示例#2
0
        public Task SendAsync(EmailQueueToken token, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            var message = new BasicEmailQueueMessage {
                Token = token, DequeueCount = 0
            };

            Queue.Enqueue(message);
            return(Task.FromResult(0));
        }
        public Task <EmailMessageParams> GetAsync(EmailQueueToken token, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            EmailMessageParams message;

            if (!Blobs.TryGetValue(token, out message))
            {
                message = null;
            }
            return(Task.FromResult(message));
        }
示例#4
0
        public async Task SendAsync(EmailQueueToken token, CancellationToken cancellationToken)
        {
            _logger.LogTrace("Sending new queue message {0}", token);

            if (!_initialized)
            {
                await InitializeAsync(cancellationToken);
            }

            var message = CloudQueueMessage.CreateCloudQueueMessageFromByteArray(token.EncodeBytes());
            await _queue.Value.AddMessageAsync(message, null, null, null, null, cancellationToken);
        }
示例#5
0
        public void EncodeBytes_ShouldReturnByteArrayOfCorrectLength()
        {
            // arrange
            int expected = ExpectedByteLength;
            int actual;
            var token = EmailQueueToken.Create(Application1);

            // act
            actual = token.EncodeBytes().Length;

            // assert
            Assert.Equal(expected, actual);
        }
        public Task MoveToPoisonStoreAsync(EmailQueueToken token, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            EmailMessageParams message;

            if (Blobs.TryGetValue(token, out message))
            {
                Blobs.Remove(token);
                Poison[token] = message;
            }

            return(Task.FromResult(0));
        }
示例#7
0
 public TableProcessorLogEntry(
     EmailQueueToken token,
     int retryCount,
     ProcessingStatus status,
     DateTime startUtc,
     DateTime endUtc,
     string errorMessage)
     : base(token.RequestId.ToString(), retryCount.ToString())
 {
     ErrorMessage       = errorMessage;
     ProcessStartedUtc  = startUtc;
     ProcessFinishedUtc = endUtc;
     Status             = status.ToString();
     RetryCount         = retryCount;
 }
示例#8
0
        public async Task ProcessMessage_Should_CompleteMessage_IfBlobNotFound()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage {
                Token = EmailQueueToken.Create(Guid.NewGuid())
            };
            EmailMessageParams nullBlob = null;

            _blobStore.Setup(b => b.GetAsync(message.Token, token)).ReturnsAsync(nullBlob);

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _receiver.Verify(t => t.CompleteAsync(message, token), Times.Once());
        }
示例#9
0
        public async Task ProcessMessage_ShouldNot_SendEmail_IfBlobNotFound()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage {
                Token = EmailQueueToken.Create(Guid.NewGuid())
            };
            EmailMessageParams nullBlob = null;

            _blobStore.Setup(b => b.GetAsync(message.Token, token)).ReturnsAsync(nullBlob);

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _transport.Verify(t => t.SendAsync(It.IsAny <SenderParams>()), Times.Never());
        }
示例#10
0
        public async Task ProcessMessage_ShouldNot_LogMessageSent_IfBlobNotFound()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage {
                Token = EmailQueueToken.Create(Guid.NewGuid())
            };
            EmailMessageParams nullBlob = null;

            _blobStore.Setup(b => b.GetAsync(message.Token, token)).ReturnsAsync(nullBlob);

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _logWriter.Verify(t => t.TryLogSentMessageAsync(
                                  It.IsAny <EmailQueueToken>(),
                                  It.IsAny <SentEmailInfo>(),
                                  token),
                              Times.Never());
        }
示例#11
0
        public async Task ProcessMessage_Should_MoveMessageToPoisonQueue_IfMaxDequeueReached()
        {
            // arrange
            var token   = new CancellationToken();
            var message = new TestMessage
            {
                Token        = EmailQueueToken.Create(Guid.NewGuid()),
                DequeueCount = 10
            };

            _transport.Setup(t => t.SendAsync(It.IsAny <SenderParams>()))
            .ThrowsAsync(new Exception("Could not send email"));

            _blobStore.Setup(b => b.GetAsync(message.Token, token))
            .ReturnsAsync(new EmailMessageParams());

            // act
            await _target.ProcessMessage(message, token);

            // assert
            _receiver.Verify(r => r.MoveToPoisonQueueAsync(message, token));
            _blobStore.Verify(r => r.MoveToPoisonStoreAsync(message.Token, token));
        }
 public Task RemoveAsync(EmailQueueToken token, CancellationToken cancellationToken)
 {
     cancellationToken.ThrowIfCancellationRequested();
     Blobs.Remove(token);
     return(Task.FromResult(0));
 }