예제 #1
0
        async Task RunTestCase(bool compressed, LargeMessageMode handlingMode, QueueKind kind)
        {
            IContainer   container;
            IQueueReader reader;
            int          batchCount;
            var          queueSettings = new QueueLoggerSettings
            {
                CompressMessage = compressed,
                OverflowHanding = handlingMode
            };

            IActivityLogger logger;

            if (kind == QueueKind.ServiceBus)
            {
                container  = RegisterServiceBusContainer(out logger, queueSettings);
                reader     = new ServiceBusQueueReader(container.Resolve <QueueClient>(), queueSettings);
                batchCount = 1000;
            }
            else
            {
                container  = RegisterAzureQueueContainer(out logger, queueSettings);
                reader     = new AzureQueueReader(container.Resolve <CloudQueue>(), queueSettings);
                batchCount = 30;
            }
            await LogItems(logger, container, queueSettings, reader, batchCount);
        }
예제 #2
0
        private async Task LogItems(IActivityLogger logger, IContainer container, QueueLoggerSettings loggerSettings, IQueueReader reader, int batchCount)
        {
            //write all messages
            var activities      = GetTestActivityList();
            int countExceptions = 0;

            for (var i = 0; i < activities.Count; ++i)
            {
                try
                {
                    await logger.LogAsync(activities[i]);
                }
                catch (Exception e)
                {
                    countExceptions++;
                    //make sure that we not hiding errors...
                    if (loggerSettings.OverflowHanding != LargeMessageMode.Error)
                    {
                        throw e;
                    }
                }
            }

            List <Activity> completelist   = new List <Activity>();
            List <Activity> readActivities = new List <Activity>()
            {
                new Activity()
            };

            while (readActivities.Count != 0)
            {
                //now read all messages, using reader
                readActivities = await reader.ReadBatchAsync(batchCount, TimeSpan.FromSeconds(1));

                //give it some time to catch up, if the queue is muti-tennant it will take time for messages to arrive
                Thread.Sleep(2000);
                completelist.AddRange(readActivities);
            }

            //test validation
            if (logger is AzureQueueActivityLogger)
            {
                //make sure we got the same number we sent in.
                if (loggerSettings.OverflowHanding == LargeMessageMode.Trim)
                {
                    Assert.AreEqual(activities.Count, completelist.Count);
                }
                else if (loggerSettings.OverflowHanding == LargeMessageMode.Discard)
                {
                    if (loggerSettings.CompressMessage)
                    {
                        //here we expect that one messages will be dropped as after compression it is too large in size.
                        Assert.AreEqual(activities.Count, completelist.Count + 1);
                    }
                    else
                    {
                        //here we expect that two messages will be dropped as they are too large in size.
                        Assert.AreEqual(activities.Count, completelist.Count + 2);
                    }
                }
                else if (loggerSettings.OverflowHanding == LargeMessageMode.Error)
                {
                    //here we expect that two messages to generate errors as they are too large in size.
                    Assert.AreEqual(activities.Count, completelist.Count + countExceptions);
                }
            }
            else
            {
                // these messages easily pass so count is good.
                Assert.AreEqual(activities.Count, completelist.Count);
            }
        }
예제 #3
0
        private static IContainer RegisterServiceBusContainer(out IActivityLogger logger, QueueLoggerSettings queueSettings)
        {
            var queueName = "mytestqueue";
            ///
            ///   Service bus connection string looks like this:
            ///   Endpoint=sb://myservicebusmodule.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=m0nmPm2T4JFIAOs8G2vpJrnz9QKUp1HvZq6baRMIrVs=
            ///
            var connectionstring = "<enter service bus connection here>";

            if (connectionstring == "<enter service bus connection here>")
            {
                throw new ArgumentException("need to provide a service bus connection string");
            }

            //delete as part of the test
            NamespaceManager namespaceManager =
                NamespaceManager.CreateFromConnectionString(connectionstring);

            namespaceManager.DeleteQueue(queueName);

            var builder = new ContainerBuilder();

            builder.RegisterModule(new QueueActivityModule(connectionstring, queueName, queueSettings));
            var container = builder.Build();

            logger = container.Resolve <IActivityLogger>();

            return(container);
        }
예제 #4
0
        private static IContainer RegisterAzureQueueContainer(out IActivityLogger logger, QueueLoggerSettings queueSettings)
        {
            var queueName = "myquename";
            var account   = CloudStorageAccount.DevelopmentStorageAccount;

            //delete as part of the test
            account.CreateCloudQueueClient().GetQueueReference(queueName).DeleteIfExists();

            var builder = new ContainerBuilder();

            builder.RegisterModule(new QueueActivityModule(account, queueName, queueSettings));
            var container = builder.Build();

            logger = container.Resolve <IActivityLogger>();

            return(container);
        }