コード例 #1
0
        public async Task WhenUsingExtendedCharacters_IsDecodedCorrectly()
        {
            var settings = TestHelpers.GetSettings();
            var handlers = new Dictionary <string, IMessageHandler>();

            handlers.Add(typeof(TestMessage1).FullName, new EncodingTestHandler());
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            var factory = container.GetInstance <IMessagingFactory>();

            var queueName = "my-first-queue";
            var sender    = factory.CreateMessageSender(queueName);
            await sender.Send(new TestMessage1 { TestProperty = "巴黎" });

            var handler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(TestMessage1)) as EncodingTestHandler;

            await TestHelpers.PumpQueueUntil(factory, queueName, () =>
            {
                return(handler.Calls.Count == 1);
            }).ConfigureAwait(false);

            Assert.AreEqual(1, handler.Calls.Count);
            Assert.AreEqual(true, handler.ExpectedContentFound);
        }
コード例 #2
0
        public async Task SendWithIMessageSenderFactory()
        {
            var settings = TestHelpers.GetSettings();
            var queueName = "my-first-queue";
            var tenantId = Guid.Parse("CDBFB8A7-FEFF-4559-BFFB-301A2CB4E0BE");

            // Do a send using only the sending infrastucture
            {
                var sendOnlyContainer = TestHelpers.GetSendOnlyContainer(settings);
                var senderFactory = sendOnlyContainer.GetInstance<IMessageSenderFactory>();
                var sender = senderFactory.CreateMessageSender(queueName);
                await sender.Send(new TestMessage1(), null, tenantId);
            }
           
            // Receive using the full infrastructure to test that the send worked
            var handlers = new Dictionary<string, IMessageHandler>();
            handlers.Add(typeof(TestMessage1).FullName, new MessageSenderTestMessageHandler());
            var mhf = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            
            var factory = container.GetInstance<IMessagingFactory>();
            
            var handler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(TestMessage1)) as MessageSenderTestMessageHandler;

            await TestHelpers.PumpQueueUntil(factory, queueName, () =>
            {
                return handler.Calls.Count == 1;
            }).ConfigureAwait(false);

            Assert.AreEqual(1, handler.Calls.Count);
            Assert.AreEqual(true, handler.ExpectedTenantIdFound);
        }
コード例 #3
0
        public async Task NonTransactionalHandlerSendsMessageToSameQueueOnFailure()
        {
            var settings = TestHelpers.GetSettings();
            var handlers = new Dictionary <string, IMessageHandler>();

            handlers.Add(typeof(TestMessage1).FullName, new NonTransactionalHandler());
            handlers.Add(typeof(TestMessage2).FullName, new SecondStageHandler());
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);
            var factory   = container.GetInstance <IMessagingFactory>();

            var nonTransactionalHandler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(TestMessage1)) as NonTransactionalHandler;
            var secondStageHandler      = factory.MessageHandlerFactory.CreateMessageHandler(typeof(TestMessage2)) as SecondStageHandler;

            var sender = factory.CreateMessageSender("my-first-queue");

            await sender.Send(new TestMessage1 { TestProperty = "my-first-queue" });

            await TestHelpers.PumpQueueUntil(factory, "my-first-queue", () =>
            {
                return(nonTransactionalHandler.Calls.Count == 2 &&
                       secondStageHandler.Calls.Count == 1);
            });

            Assert.AreEqual(2, nonTransactionalHandler.Calls.Count);
            Assert.AreEqual(1, secondStageHandler.Calls.Count);
        }
コード例 #4
0
        public async Task PeekMessagePump_WhenMessageWithTenantIdDoesNotExists_ReturnsFalse()
        {
            var settings  = TestHelpers.GetSettings();
            var handlers  = new Dictionary <string, IMessageHandler>();
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            var factory = container.GetInstance <IMessagingFactory>();

            var queueName = "my-first-queue";

            var sender = factory.CreateMessageSender(queueName);

            var tenantId = Guid.Parse("CDBFB8A7-FEFF-4559-BFFB-301A2CB4E0BE");

            await sender.Send(new TestMessage1(), null, tenantId);

            var nonExistingTenantId = Guid.Parse("313E92AB-2719-4C6B-8BC4-4A88240E4FB8");

            var messagePump = factory.CreatePeekMessagePump(queueName);

            var hasMessage = await messagePump.PeekMessage(nonExistingTenantId, new CancellationToken());

            Assert.IsFalse(hasMessage);
        }
コード例 #5
0
        public async Task DuplicateMessageIdsAreReceivedWhenUsingANonDedupQueue()
        {
            var settings = TestHelpers.GetSettings();
            var handlers = new Dictionary <string, IMessageHandler>();

            handlers.Add(typeof(TestMessage1).FullName, new DeduplicationTestMessageHandler());
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            var factory = container.GetInstance <IMessagingFactory>();

            // "my-first-queue" has not been configured to deduplicate messages
            var sender = factory.CreateMessageSender("my-first-queue");

            var handler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(TestMessage1)) as DeduplicationTestMessageHandler;

            await sender.Send(new TestMessage1(), "1234");

            await sender.Send(new TestMessage1(), "1234");

            await sender.Send(new TestMessage1(), "1234");

            await sender.Send(new TestMessage1(), "1234");

            await TestHelpers.PumpQueueUntil(factory, "my-first-queue", () =>
            {
                return(handler.Calls.Count == 4);
            }).ConfigureAwait(false);

            Assert.AreEqual(4, handler.Calls.Count);
            Assert.AreEqual(true, handler.ExpectedIdFound);
        }
コード例 #6
0
        public async Task MessageSender_WhenTenantIdIsProvided_MessageContainsTenantIdProperty()
        {
            var settings = TestHelpers.GetSettings();
            var handlers = new Dictionary <string, IMessageHandler>();

            handlers.Add(typeof(TestMessage1).FullName, new MessageSenderTestMessageHandler());
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            var factory = container.GetInstance <IMessagingFactory>();

            var queueName = "my-first-queue";
            var sender    = factory.CreateMessageSender(queueName);
            var tenantId  = Guid.Parse("CDBFB8A7-FEFF-4559-BFFB-301A2CB4E0BE");
            await sender.Send(new TestMessage1(), null, tenantId);

            var handler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(TestMessage1)) as MessageSenderTestMessageHandler;

            await TestHelpers.PumpQueueUntil(factory, queueName, () =>
            {
                return(handler.Calls.Count == 1);
            }).ConfigureAwait(false);

            Assert.AreEqual(1, handler.Calls.Count);
            Assert.AreEqual(true, handler.ExpectedTenantIdFound);
        }
コード例 #7
0
        public async Task MessagesCanBeDeferred(int messageSizeKb, int timesToDefer, int timesToAbandon, bool complete, int expectedCalls)
        {
            var settings = TestHelpers.GetSettings();
            var handlers = new Dictionary <string, IMessageHandler>();

            handlers.Add(typeof(DeferralTestMessage).FullName, new DeferralTestMessageHandler());
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            var factory = container.GetInstance <IMessagingFactory>();
            var handler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(DeferralTestMessage)) as DeferralTestMessageHandler;

            var queueName = "my-first-queue";

            var sender = factory.CreateMessageSender(queueName);

            var message = new DeferralTestMessage()
            {
                NumberOfTimesToDefer   = timesToDefer,
                NumberOfTimesToAbandon = timesToAbandon,
                Complete = complete,
            };

            // Pad the ALongString property out to meet the required message size
            for (int i = 0; i < messageSizeKb * 16; ++i)
            {
                message.ALongString += "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
            }

            // Send a message to be deferred, then abandoned, then deadlettered or completed
            await sender.Send(message).ConfigureAwait(false);

            await TestHelpers.PumpQueueUntil(factory, queueName, async() =>
            {
                if (handler.Calls.Count != expectedCalls)
                {
                    return(false);
                }

                // if we deferred any messages, there should be 2 raw messages in the DLQ - 1 actual message and 1 control message from the deferral
                var expectedDeadLetteredItems = 0;
                if (complete == false)
                {
                    expectedDeadLetteredItems = timesToDefer > 0 ? 2 : 1;
                }
                var deadLetterQueue   = EntityNameHelper.FormatDeadLetterPath(queueName);
                var deadLetteredItems = await TestHelpers.GetAllRawMessagesByContextId(settings, deadLetterQueue).ConfigureAwait(false);
                return(expectedDeadLetteredItems == deadLetteredItems.Count);
            }).ConfigureAwait(false);

            Assert.AreEqual(expectedCalls, handler.Calls.Count);
        }
コード例 #8
0
        public async Task PerfTest()
        {
            ServicePointManager.DefaultConnectionLimit = 1000;

            var settings = TestHelpers.GetSettings();

            settings.PrefetchCount = 300;
            var handlers = new Dictionary <string, IMessageHandler>();

            handlers.Add(typeof(PerformanceTestMessage).FullName, new PerformanceTestMessageHandler());
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            var factory = container.GetInstance <IMessagingFactory>();

            var sender = factory.CreateMessageSender("my-first-queue");

            using (var t1 = new Timer($"Send {totalMessageCount} messages"))
            {
                var sendTasks = new Task[totalMessageCount];
                for (int i = 0; i < totalMessageCount; ++i)
                {
                    sendTasks[i] = SendMessage(sender);
                }
                await Task.WhenAll(sendTasks);
            }

            Console.WriteLine($"Sent {smallMessageCount} {smallMessageSizeKb} KB messages, {mediumMessageCount} {mediumMessageSizeKb} KB messages and {largeMessageCount} {largeMessageSizeKb} KB messages.");

            var pump    = factory.CreateMessagePump("my-first-queue");
            var handler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(PerformanceTestMessage)) as PerformanceTestMessageHandler;

            using (var t2 = new Timer($"Receive {totalMessageCount} messages"))
            {
                await pump.Start();

                while (handler.Calls.Count < totalMessageCount)
                {
                    await Task.Delay(1000);
                }

                await pump.Stop();
            }
        }
コード例 #9
0
        public async Task TransactionalHandlerDoesntSendMessageToDifferentQueueOnFailure()
        {
            var settings = TestHelpers.GetSettings();
            var handlers = new Dictionary <string, IMessageHandler>();

            handlers.Add(typeof(TestMessage1).FullName, new TransactionalHandler());
            handlers.Add(typeof(TestMessage2).FullName, new SecondStageHandler());
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            var factory = container.GetInstance <IMessagingFactory>();

            var sender = factory.CreateMessageSender("my-first-queue");

            var transactionalHandler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(TestMessage1)) as TransactionalHandler;

            // Send a message to the first queue, the handler will send a message to the second queue
            // (but will throw an exception and abort the transaction, and the message to the second queue
            // will not actually be sent)
            await sender.Send(new TestMessage1 { TestProperty = "my-second-queue" });

            await TestHelpers.PumpQueueUntil(factory, "my-first-queue", () =>
            {
                return(transactionalHandler.Calls.Count == 2);
            });

            // pump the second queue for 5 seconds and verify no message was received
            var pump2 = factory.CreateMessagePump("my-second-queue");

            await pump2.Start();

            await Task.Delay(5000);

            await pump2.Stop();

            var secondStageHandler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(TestMessage2)) as SecondStageHandler;

            Assert.AreEqual(2, transactionalHandler.Calls.Count);
            Assert.AreEqual(0, secondStageHandler.Calls.Count);
        }
コード例 #10
0
        public async Task PeekMessagePump_WhenCanceled_ReturnsTrue()
        {
            var settings  = TestHelpers.GetSettings();
            var handlers  = new Dictionary <string, IMessageHandler>();
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            var factory = container.GetInstance <IMessagingFactory>();

            var queueName = "my-first-queue";

            var sender = factory.CreateMessageSender(queueName);

            var tenantId = Guid.Parse("CDBFB8A7-FEFF-4559-BFFB-301A2CB4E0BE");

            var messagePump = factory.CreatePeekMessagePump(queueName);

            var cancelledToken = new CancellationToken(true);
            var hasMessage     = await messagePump.PeekMessage(tenantId, cancelledToken);

            Assert.IsTrue(hasMessage);
        }
コード例 #11
0
        public async Task ExceptionsDeadLetterMessagesWithUsefulDeadLetterFields()
        {
            var settings = TestHelpers.GetSettings();
            var handlers = new Dictionary <string, IMessageHandler>();

            handlers.Add(typeof(TestMessage1).FullName, new DeadLetterFieldTestHandler());
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            var factory = container.GetInstance <IMessagingFactory>();

            // "dedup-queue" has been configured to deduplicate messages
            var sender = factory.CreateMessageSender("my-first-queue");

            await sender.Send(new TestMessage1(), "1234");

            var handler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(TestMessage1)) as DeadLetterFieldTestHandler;

            await TestHelpers.PumpQueueUntil(factory, "my-first-queue", () =>
            {
                return(handler.Calls.Count == 10);
            }).ConfigureAwait(false);

            Assert.AreEqual(10, handler.Calls.Count);

            var deadLetterQueue   = EntityNameHelper.FormatDeadLetterPath("my-first-queue");
            var deadLetteredItems = await TestHelpers.GetAllRawMessagesByContextId(settings, deadLetterQueue).ConfigureAwait(false);

            Assert.AreEqual(1, deadLetteredItems.Count);

            Assert.AreEqual("System.ApplicationException: This is an exception that should cause the message to be dead-lettered eventually.", deadLetteredItems[0].UserProperties["DeadLetterReason"]);
            var deadLetterErrorDescription = deadLetteredItems[0].UserProperties["DeadLetterErrorDescription"].ToString();
            var expectedStartOfDeadLetterErrorDescription = "System.ApplicationException: This is an exception that should cause the message to be dead-lettered eventually.\r\n   at RecordPoint.Messaging.AzureServiceBus.IntegrationTest.DeadLetterFieldTestHandler";

            Assert.IsTrue(deadLetterErrorDescription.StartsWith(expectedStartOfDeadLetterErrorDescription));
            Assert.IsTrue(deadLetterErrorDescription.Length <= 1024);
        }
コード例 #12
0
        [Ignore]    // hangs in the CI build
        public async Task TransactionalHandlerFailsWithExplicitDbTransactions()
        {
            var settings = TestHelpers.GetSettings();
            var handlers = new Dictionary <string, IMessageHandler>();

            handlers.Add(typeof(TestMessage1).FullName, new TransactionalHandlerWithDbTransaction());
            var mhf       = new GenericMessageHandlerFactory(handlers);
            var container = TestHelpers.GetContainer(settings, mhf);

            var factory = container.GetInstance <IMessagingFactory>();

            var sender = factory.CreateMessageSender("my-first-queue");

            var transactionalHandler = factory.MessageHandlerFactory.CreateMessageHandler(typeof(TestMessage1)) as TransactionalHandlerWithDbTransaction;

            await sender.Send(new TestMessage1());

            await TestHelpers.PumpQueueUntil(factory, "my-first-queue", () =>
            {
                return(transactionalHandler.Calls.Count == 2);
            });

            Assert.AreEqual(0, transactionalHandler.CommittedTransactions.Count);
        }