コード例 #1
0
        private void btnGenerate_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtCount.Text) && !string.IsNullOrEmpty(txtProductId.Text) && !string.IsNullOrEmpty(txtDatabaseId.Text) && !string.IsNullOrEmpty(txtDSN.Text))
            {
                int productId           = 0;
                var productIds          = txtProductId.Text.Split(_semicolon);
                var productIdCollection = new List <int>();
                if (productIds.Length > 1)
                {
                    for (int i = 0; i < productIds.Length; i++)
                    {
                        productIdCollection.Add(int.Parse(productIds[i]));
                    }
                }
                else
                {
                    productId = int.Parse(txtProductId.Text);
                }

                int count = int.Parse(txtCount.Text);
                Constants.EntityType entityType = (Constants.EntityType)Enum.Parse(typeof(Constants.EntityType),
                                                                                   cbProductType.SelectedItem.ToString());
                Constants.MessageActionType messageType = (Constants.MessageActionType)Enum.Parse(typeof(Constants.MessageActionType), cbMessageType.SelectedItem.ToString());

                int    databaseId = int.Parse(txtDatabaseId.Text);
                string dsn        = txtDSN.Text;

                MsmqManager manager = new MsmqManager(_config.NormalQueueName, _config.PoisonQueueName);
                var         msg     = new UpdateMessage()
                {
                    Action       = (int)messageType,
                    DSN          = dsn,
                    DatabaseID   = databaseId,
                    EntityTypeId = (int)entityType,
                    ExternalId   = databaseId.ToString(),
                    GroupID      = 1,
                    ProductID    = productId
                };

                if (productIdCollection.Any())
                {
                    var json = JsonConvert.SerializeObject(productIdCollection);
                    msg.ExtendedProperties = json;
                    msg.ProductID          = default(int);
                }

                for (int i = 0; i < count; i++)
                {
                    manager.mqSend(msg, MessagePriority.High);
                }
            }
        }
コード例 #2
0
        public void ProcessRealQueueMessages(int maxMessageCount)
        {
            var halfQueueSize = (int)(maxMessageCount / 2);
            var config        = new AppConfiguration();

            //clear normal queue
            var queue = new MessageQueue(config.NormalQueueName);

            queue.Purge();

            var messageManager = new MsmqManager(config.NormalQueueName, config.PoisonQueueName);
            List <UpdateMessage> processMessages = new List <UpdateMessage>();
            IListener            listener        = null;

            List <string> calledStoredProcedures = new List <string>();

            //mock bd manager and stop processing of messages when half and all messages are read. Simulate start/pause/continue
            var dbManager = new Mock <IDatabaseManager>();

            dbManager.Setup(x => x.GetImportSettings(It.IsAny <string>(), It.IsAny <int>())).Returns(new Dictionary <string, ImportTypeSettings>());
            dbManager.Setup(x => x.Execute(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <SqlParameter[]>())).Callback((string connectionString, string spName, SqlParameter[] parameters) =>
            {
                calledStoredProcedures.Add(spName);
                if (halfQueueSize == calledStoredProcedures.Count || maxMessageCount == calledStoredProcedures.Count)
                {
                    listener.CanProcess = false;
                }
            }).Returns(1);
            dbManager.Setup(x => x.Execute(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <SqlParameter[]>())).Callback((string connectionString, string spName, int timeout, SqlParameter[] parameters) =>
            {
                calledStoredProcedures.Add(spName);
                if (halfQueueSize == calledStoredProcedures.Count || maxMessageCount == calledStoredProcedures.Count)
                {
                    listener.CanProcess = false;
                }
            }).Returns(1);

            listener = new Listener(config, dbManager.Object, messageManager);

            Hashtable activeDatabases = new Hashtable();
            Hashtable timestamps      = new Hashtable();

            for (int i = 0; i < maxMessageCount; i++)
            {
                var singleMessage = new UpdateMessage()
                {
                    DatabaseID = 1, ExternalId = "1", DSN = "123", EntityTypeId = 20, Action = (int)MessageActionType.UpdatedProductNutrient, GroupID = 1, ProductID = i, ArrivedTime = DateTime.UtcNow
                };
                messageManager.mqSend(singleMessage, MessagePriority.Normal);
            }

            //try process half messages
            listener.CanProcess = true;
            listener.ExecuteAsync(activeDatabases, timestamps);

            var items = queue.GetAllMessages();

            items.Should().NotBeEmpty();
            items.Length.Should().Be(maxMessageCount - halfQueueSize);
            calledStoredProcedures.Count.Should().Be(halfQueueSize);

            //try process another half
            listener.CanProcess = true;
            listener.ExecuteAsync(activeDatabases, timestamps);

            items = queue.GetAllMessages();
            items.Should().BeEmpty();
            calledStoredProcedures.Count.Should().Be(maxMessageCount);
        }