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"); }
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)); }
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)); }
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)); }); }
public Task StartMessageReceiver(string queueName, MessageReceiverOptions options, Func <ISQSMessage, Task> asyncMessageProcessor, CancellationToken cancellationToken) { return(StartMessageReceiverInternal(queueName, options, asyncMessageProcessor, cancellationToken)); }
public Task StartMessageReceiver(string queueName, MessageReceiverOptions options, Action <ISQSMessage> messageProcessor, CancellationToken cancellationToken) { return(StartMessageReceiverInternal(queueName, options, async(arg) => messageProcessor(arg), cancellationToken)); }