public async Task GetMetrics_ReturnsExpectedResult()
        {
            var queuesOptions = new QueuesOptions();
            Mock <ITriggerExecutor <QueueMessage> > mockTriggerExecutor = new Mock <ITriggerExecutor <QueueMessage> >(MockBehavior.Strict);
            var           queueProcessorFactory = new DefaultQueueProcessorFactory();
            QueueListener listener = new QueueListener(Fixture.Queue, null, mockTriggerExecutor.Object, new WebJobsExceptionHandler(null),
                                                       _loggerFactory, null, queuesOptions, queueProcessorFactory, new FunctionDescriptor {
                Id = "TestFunction"
            });

            var metrics = await listener.GetMetricsAsync();

            Assert.AreEqual(0, metrics.QueueLength);
            Assert.AreEqual(TimeSpan.Zero, metrics.QueueTime);
            Assert.AreNotEqual(default(DateTime), metrics.Timestamp);

            // add some test messages
            for (int i = 0; i < 5; i++)
            {
                await Fixture.Queue.SendMessageAsync($"Message {i}");
            }

            await Task.Delay(TimeSpan.FromSeconds(5));

            metrics = await listener.GetMetricsAsync();

            Assert.AreEqual(5, metrics.QueueLength);
            Assert.True(metrics.QueueTime.Ticks > 0);
            Assert.AreNotEqual(default(DateTime), metrics.Timestamp);

            // verify non-generic interface works as expected
            metrics = (QueueTriggerMetrics)(await((IScaleMonitor)listener).GetMetricsAsync());
            Assert.AreEqual(5, metrics.QueueLength);
        }
        public async Task UpdatedQueueMessage_RetainsOriginalProperties()
        {
            CloudQueue queue       = Fixture.CreateNewQueue();
            CloudQueue poisonQueue = Fixture.CreateNewQueue();

            var queuesOptions = new QueuesOptions {
                MaxDequeueCount = 2
            };

            Mock <ITriggerExecutor <CloudQueueMessage> > mockTriggerExecutor = new Mock <ITriggerExecutor <CloudQueueMessage> >(MockBehavior.Strict);

            string            messageContent = Guid.NewGuid().ToString();
            CloudQueueMessage message        = new CloudQueueMessage(messageContent);
            await queue.AddMessageAsync(message, null, null, null, null, CancellationToken.None);

            CloudQueueMessage messageFromCloud = await queue.GetMessageAsync();

            var queueProcessorFactory = new DefaultQueueProcessorFactory();

            QueueListener listener = new QueueListener(queue, poisonQueue, mockTriggerExecutor.Object, new WebJobsExceptionHandler(null),
                                                       null, null, queuesOptions, queueProcessorFactory);

            mockTriggerExecutor
            .Setup(m => m.ExecuteAsync(It.IsAny <CloudQueueMessage>(), CancellationToken.None))
            .ReturnsAsync(new FunctionResult(false));

            await listener.ProcessMessageAsync(messageFromCloud, TimeSpan.FromMinutes(10), CancellationToken.None);

            // pull the message and process it again (to have it go through the poison queue flow)
            messageFromCloud = await queue.GetMessageAsync();

            Assert.Equal(2, messageFromCloud.DequeueCount);

            await listener.ProcessMessageAsync(messageFromCloud, TimeSpan.FromMinutes(10), CancellationToken.None);

            // Make sure the message was processed and deleted.
            await queue.FetchAttributesAsync();

            Assert.Equal(0, queue.ApproximateMessageCount);

            // The Listener has inserted a message to the poison queue.
            await poisonQueue.FetchAttributesAsync();

            Assert.Equal(1, poisonQueue.ApproximateMessageCount);

            mockTriggerExecutor.Verify(m => m.ExecuteAsync(It.IsAny <CloudQueueMessage>(), CancellationToken.None), Times.Exactly(2));
        }
Пример #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="JobHostQueuesConfiguration"/> class.
 /// </summary>
 internal JobHostQueuesConfiguration()
 {
     _newBatchThreshold    = -1;
     QueueProcessorFactory = new DefaultQueueProcessorFactory();
 }