示例#1
0
        private void WaitForQueue(string queueName, MessageReceiverOptions options)
        {
            for (var i = 0; i < options.WaitForQueueTimeoutSeconds; i++)
            {
                MockClientObject.Queues.TryGetValue(queueName, out var queue);

                if (queue != null)
                {
                    return;
                }

                Task.Delay(1000).Wait();
            }

            throw new QueueDoesNotExistException($"Queue {queueName} does not exist");
        }
示例#2
0
        private Task StartMessageReceiverInternal(string queueName, MessageReceiverOptions options,
                                                  Func <string, Task <bool> > asyncMessageProcessor, CancellationToken cancellationToken)
        {
            if (options.WaitForQueue)
            {
                WaitForQueue(queueName, options);
            }

            return(Task.Run(async() =>
            {
                while (!cancellationToken.IsCancellationRequested)
                {
                    MockClientObject.Queues.TryGetValue(queueName, out var queue);
                    if (queue == null)
                    {
                        throw new QueueDoesNotExistException($"Queue {queueName} does not exist.");
                    }

                    if (!queue.Any() || queue.Peek().IsLocked)
                    {
                        await Task.Delay(10, cancellationToken);
                        continue;
                    }

                    if (IsFifoQueue(queueName))
                    {
                        LockFirstMessageInQueue(queue);
                    }
                    var message = PeekFirstMessageInQueue(queue);

                    var successful = await asyncMessageProcessor(message.Message);
                    if (successful)
                    {
                        queue.Dequeue();
                    }
                    else
                    {
                        UnlockFirstMessageInQueue(queue);
                    }
                    MockClientObject.QueueMessageProcessed[queueName] = true;
                }
            }, cancellationToken));
        }
示例#3
0
        private Task StartMessageReceiverInternal(string queueName, MessageReceiverOptions options,
                                                  Func <ISQSMessage, Task> asyncMessageProcessor, CancellationToken cancellationToken)
        {
            if (options.WaitForQueue)
            {
                WaitForQueue(queueName, options);
            }

            return(Task.Run(async() =>
            {
                while (!cancellationToken.IsCancellationRequested)
                {
                    MockClientObject.Queues.TryGetValue(queueName, out var queue);
                    if (queue == null)
                    {
                        throw new QueueDoesNotExistException($"Queue {queueName} does not exist.");
                    }

                    if (!queue.Any() || queue.Peek().IsLocked)
                    {
                        await Task.Delay(10, cancellationToken);
                        continue;
                    }

                    if (IsFifoQueue(queueName))
                    {
                        LockFirstMessageInQueue(queue);
                    }
                    var message = PeekFirstMessageInQueue(queue);
                    var sqsMessage = new SQSMessageMock(this, queueName, "MockReceiptHandle")
                    {
                        Body = message.Message,
                        MessageAttributes = message.MessageAttributes
                    };

                    await asyncMessageProcessor(sqsMessage);
                    UnlockFirstMessageInQueue(queue);
                    MockClientObject.QueueMessageProcessed[queueName] = true;
                }
            }, cancellationToken));
        }
示例#4
0
        public void StartMessageReceiver_ShouldThrowQueueDoesNotExistExceptionWithSyncMethod_IfQueueDoesNotExistAndShouldWaitForQueue()
        {
            var queueName = $"{Guid.NewGuid().ToString()}";
            var client    = CreateSQSClient();

            var cancellationTokenSource = new CancellationTokenSource();
            var cancellationToken       = cancellationTokenSource.Token;

            Assert.ThrowsAsync <QueueDoesNotExistException>(() =>
            {
                var messageReceiverOptions = new MessageReceiverOptions
                {
                    WaitForQueue = true,
                    WaitForQueueTimeoutSeconds = 1
                };
                return(client.StartMessageReceiver(queueName, messageReceiverOptions,
                                                   (string message) =>
                {
                    Assert.Equal("Hello World!", message);
                    return true;
                }, cancellationToken));
            });
        }
示例#5
0
 public Task StartMessageReceiver(string queueName, MessageReceiverOptions options, Func <ISQSMessage, Task> asyncMessageProcessor,
                                  CancellationToken cancellationToken)
 {
     return(StartMessageReceiverInternal(queueName, options, asyncMessageProcessor, cancellationToken));
 }
示例#6
0
 public Task StartMessageReceiver(string queueName, MessageReceiverOptions options, Action <ISQSMessage> messageProcessor,
                                  CancellationToken cancellationToken)
 {
     return(StartMessageReceiverInternal(queueName, options, async(arg) => messageProcessor(arg), cancellationToken));
 }