Ejemplo n.º 1
0
        public async Task TestListAllQueueMessagesWithUpdates()
        {
            IQueueingService provider = CreateProvider();

            using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(TestTimeout(TimeSpan.FromSeconds(10))))
            {
                QueueName queueName = CreateRandomQueueName();

                await provider.CreateQueueAsync(queueName, cancellationTokenSource.Token);

                List <Task> postMessagesTasks = new List <Task>();
                for (int i = 0; i < 28; i++)
                {
                    postMessagesTasks.Add(provider.PostMessagesAsync(queueName, cancellationTokenSource.Token, new Message <SampleMetadata>(TimeSpan.FromSeconds(120), new SampleMetadata(i, "Some Message " + i))));
                }

                await Task.Factory.ContinueWhenAll(postMessagesTasks.ToArray(), TaskExtrasExtensions.PropagateExceptions);

                HashSet <int> locatedMessages = new HashSet <int>();

                QueuedMessageList messages = await provider.ListMessagesAsync(queueName, null, null, true, false, cancellationTokenSource.Token);

                foreach (QueuedMessage message in messages)
                {
                    Assert.IsTrue(locatedMessages.Add(message.Body.ToObject <SampleMetadata>().ValueA), "Received the same message more than once.");
                }

                int deletedMessage = messages[0].Body.ToObject <SampleMetadata>().ValueA;
                await provider.DeleteMessageAsync(queueName, messages[0].Id, null, cancellationTokenSource.Token);

                while (messages.Count > 0)
                {
                    QueuedMessageList tempList = await provider.ListMessagesAsync(queueName, messages.NextPageId, null, true, false, cancellationTokenSource.Token);

                    if (tempList.Count > 0)
                    {
                        Assert.IsTrue(locatedMessages.Add(tempList[0].Body.ToObject <SampleMetadata>().ValueA), "Received the same message more than once.");
                        await provider.DeleteMessageAsync(queueName, tempList[0].Id, null, cancellationTokenSource.Token);
                    }

                    messages = await provider.ListMessagesAsync(queueName, messages.NextPageId, null, true, false, cancellationTokenSource.Token);

                    foreach (QueuedMessage message in messages)
                    {
                        Assert.IsTrue(locatedMessages.Add(message.Body.ToObject <SampleMetadata>().ValueA), "Received the same message more than once.");
                    }
                }

                Assert.AreEqual(28, locatedMessages.Count);
                for (int i = 0; i < 28; i++)
                {
                    Assert.IsTrue(locatedMessages.Contains(i), "The message listing did not include message '{0}', which was in the queue when the listing started and still in it afterwards.", i);
                }

                await provider.DeleteQueueAsync(queueName, cancellationTokenSource.Token);
            }
        }
Ejemplo n.º 2
0
        private async Task <int> PublishMessages(QueueName requestQueueName, QueueName replyQueueName, CancellationToken token)
        {
            IQueueingService queueingService = CreateProvider();
            int processedMessages            = 0;

            try
            {
                Random random = new Random();

                while (true)
                {
                    long x = random.Next();
                    long y = random.Next();

                    Message <CalculatorOperation> message = new Message <CalculatorOperation>(TimeSpan.FromMinutes(5), new CalculatorOperation(replyQueueName, "+", x, y));
                    await queueingService.PostMessagesAsync(requestQueueName, token, message);

                    bool handled = false;
                    while (true)
                    {
                        // process reply messages
                        using (Claim claim = await queueingService.ClaimMessageAsync(replyQueueName, null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1), token))
                        {
                            foreach (QueuedMessage queuedMessage in claim.Messages)
                            {
                                CalculatorResult result = queuedMessage.Body.ToObject <CalculatorResult>();
                                if (result._id == message.Body._id)
                                {
                                    // this is the reply to this thread's operation
                                    Assert.AreEqual(message.Body._operand1 + message.Body._operand2, result._result);
                                    Assert.AreEqual(x + y, result._result);
                                    await queueingService.DeleteMessageAsync(replyQueueName, queuedMessage.Id, claim, token);

                                    processedMessages++;
                                    handled = true;
                                }
                                else if (token.IsCancellationRequested)
                                {
                                    // shutdown trigger
                                    return(processedMessages);
                                }
                            }

                            // start the dispose process using DisposeAsync so the CancellationToken is honored
                            Task disposeTask = claim.DisposeAsync(token);
                        }

                        if (handled)
                        {
                            break;
                        }
                    }
                }
            }
            catch (AggregateException ex)
            {
                ex.Flatten().Handle(
                    e =>
                {
                    if (e is TaskCanceledException)
                    {
                        return(true);
                    }

                    WebException webException = e as WebException;
                    if (webException != null)
                    {
                        if (webException.Status == WebExceptionStatus.RequestCanceled)
                        {
                            return(true);
                        }
                    }

                    return(false);
                });

                return(processedMessages);
            }
            catch (TaskCanceledException)
            {
                return(processedMessages);
            }
            catch (WebException ex)
            {
                if (ex.Status != WebExceptionStatus.RequestCanceled)
                {
                    throw;
                }

                return(processedMessages);
            }
        }