Exemple #1
0
        public async Task SimpleScheduleSuccessTest()
        {
            var context = _workContext.WithTag(_tag);

            int agentId = await _utility.SetupAgentAndQueue(_queueName, _agentName);

            InternalEnqueueMessageV1 message = _utility.CreateMessage(context, agentId, _queueName);

            message.ScheduleDate = DateTime.UtcNow.AddSeconds(2);

            await _message.EnqueueMessage(context, message);

            await _utility.VerifyQueue(context, _queueName, 0, 1);

            InternalMessageV1 readMessage = await _message.DequeueMessageAndDelete(context, _queueName);

            readMessage.Should().BeNull();

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

            readMessage = await _message.DequeueMessageAndDelete(context, _queueName);

            _utility.VerifyMessage(message, readMessage, agentId, false);

            InternalHistoryV1 history = await _management.GetHistory(context, readMessage.MessageId);

            _utility.VerifyHistoryMessage(readMessage, history, _queueName, _agentName);
        }
Exemple #2
0
        public async Task ListActiveQueueTest()
        {
            const int messageSize = 100;
            var       context     = _workContext.WithTag(_tag);

            int agentId = await _utility.SetupAgentAndQueue(_queueName, _agentName);

            var messageList = new List <InternalEnqueueMessageV1>();

            foreach (int index in Enumerable.Range(0, messageSize))
            {
                InternalEnqueueMessageV1 message = _utility.CreateMessage(context, agentId, _queueName);
                messageList.Add(message);

                await _message.EnqueueMessage(context, message);
            }

            await _utility.VerifyQueue(context, _queueName, messageSize, 0);

            IEnumerable <InternalMessageV1> activeMessage = await _message.ListActiveMessages(context, _queueName);

            var zip = messageList
                      .OrderBy(x => x.ClientMessageId)
                      .Zip(activeMessage.OrderBy(x => x.ClientMessageId), (f, s) => new Tuple <InternalEnqueueMessageV1, InternalMessageV1>(f, s));
        }
Exemple #3
0
        public async Task QueueAbandonTest()
        {
            var context = _workContext.WithTag(_tag);

            int agentId = await _utility.SetupAgentAndQueue(_queueName, _agentName);

            InternalEnqueueMessageV1 message = _utility.CreateMessage(context, agentId, _queueName);

            await _message.EnqueueMessage(context, message);

            await _utility.VerifyQueue(context, _queueName, 1, 0);

            InternalMessageV1 readMessage = await _message.DequeueMessageWithLock(context, _queueName, agentId);

            _utility.VerifyMessage(message, readMessage, agentId, true);

            await _message.SettleMessage(context, readMessage.MessageId, agentId, SettleType.Abandon);

            await _utility.VerifyQueue(context, _queueName, 1, 0);

            readMessage = await _message.DequeueMessageWithLock(context, _queueName, agentId);

            _utility.VerifyMessage(message, readMessage, agentId, true);

            await _message.SettleMessage(context, readMessage.MessageId, agentId, SettleType.Processed);

            await _utility.VerifyQueue(context, _queueName, 0, 0);

            InternalHistoryV1 history = await _management.GetHistory(context, readMessage.MessageId);

            _utility.VerifyHistoryMessage(readMessage, history, _queueName, _agentName, 2);
        }
Exemple #4
0
        public async Task MultipleEnqueueWithLockSuccessTest()
        {
            const int messageSize = 100;
            var       context     = _workContext.WithTag(_tag);

            int agentId = await _utility.SetupAgentAndQueue(_queueName, _agentName);

            var messageList     = new List <InternalEnqueueMessageV1>();
            var readMessageList = new List <InternalMessageV1>();

            foreach (int index in Enumerable.Range(0, messageSize))
            {
                InternalEnqueueMessageV1 message = _utility.CreateMessage(context, agentId, _queueName);
                messageList.Add(message);

                await _message.EnqueueMessage(context, message);
            }

            await _utility.VerifyQueue(context, _queueName, messageSize, 0);

            InternalMessageV1 readMessage;

            foreach (int index in Enumerable.Range(0, messageSize))
            {
                readMessage = await _message.DequeueMessageWithLock(context, _queueName, agentId);

                readMessage.Should().NotBeNull();
                readMessageList.Add(readMessage);
            }

            readMessage = await _message.DequeueMessageWithLock(context, _queueName, agentId);

            readMessage.Should().BeNull();

            var zip = messageList
                      .OrderBy(x => x.ClientMessageId)
                      .Zip(readMessageList.OrderBy(x => x.ClientMessageId), (f, s) => new Tuple <InternalEnqueueMessageV1, InternalMessageV1>(f, s));

            foreach (var item in zip)
            {
                _utility.VerifyMessage(item.Item1, item.Item2, agentId, true);
            }

            foreach (var item in readMessageList)
            {
                await _message.SettleMessage(context, item.MessageId, agentId, SettleType.Processed);
            }

            await _utility.VerifyQueue(context, _queueName, 0, 0);

            foreach (var item in readMessageList)
            {
                InternalHistoryV1 history = await _management.GetHistory(context, item.MessageId);

                _utility.VerifyHistoryMessage(item, history, _queueName, _agentName);
            }
        }
Exemple #5
0
        private async Task WriteQueue(IWorkContext context, int agentId, CancellationToken token)
        {
            while (!token.IsCancellationRequested)
            {
                try
                {
                    await Task.Delay(TimeSpan.FromMilliseconds(10), token);
                }
                catch
                {
                    continue;
                }

                InternalEnqueueMessageV1 message = _utility.CreateMessage(context, agentId, _queueName);
                await _message.EnqueueMessage(context, message);

                Interlocked.Increment(ref _writeCounter);
            }
        }
Exemple #6
0
        public async Task SimpleClearQueueHistoryTest()
        {
            var context = _workContext.WithTag(_tag);

            int agentId = await _utility.SetupAgentAndQueue(_queueName, _agentName);

            InternalEnqueueMessageV1 message = _utility.CreateMessage(context, agentId, _queueName);

            long messageId = await _message.EnqueueMessage(context, message);

            await _utility.VerifyQueue(context, _queueName, 1, 0);

            await _management.ClearQueue(context, _queueName, true);

            await _utility.VerifyQueue(context, _queueName, 0, 0);

            InternalHistoryV1 history = await _management.GetHistory(context, messageId);

            history.Should().NotBeNull();
        }
Exemple #7
0
        public void VerifyMessage(InternalEnqueueMessageV1 message, InternalMessageV1 readMessage, int agentId, bool testLock)
        {
            readMessage.Should().NotBeNull();
            readMessage.QueueId.Should().BeGreaterOrEqualTo(0);
            readMessage.MessageId.Should().BeGreaterOrEqualTo(0);
            readMessage.CreatedByAgentId.Should().Be(agentId);
            readMessage.ClientMessageId.Should().Be(message.ClientMessageId);
            readMessage.Cv.Should().Be(message.Cv);
            readMessage.Payload.Should().Be(message.Payload);

            if (testLock)
            {
                readMessage.LockedByAgentId.Should().Be(agentId);
            }

            WorkRequest readWorkRequest = readMessage.Deserialize <WorkRequest>();

            readWorkRequest.Should().NotBeNull();
            readWorkRequest.ProcessName.Should().Be("this process");
            readWorkRequest.Parameters.Should().NotBeNull();
            readWorkRequest.Parameters.Count().Should().Be(3);
        }
        public async Task <long> EnqueueMessage(IWorkContext context, InternalEnqueueMessageV1 message)
        {
            Verify.IsNotNull(nameof(message), message);

            IEnumerable <ReturnIdRow> rows;

            try
            {
                if (message.ScheduleDate != null)
                {
                    rows = await new SqlExec(_configuration.SqlConfiguration)
                           .SetCommand("[App].[Create-Schedule]")
                           .AddParameter(nameof(message.QueueName), message.QueueName)
                           .AddParameter(nameof(message.AgentId), message.AgentId)
                           .AddParameter(nameof(message.ClientMessageId), message.ClientMessageId)
                           .AddParameter(nameof(message.Cv), message.Cv)
                           .AddParameter(nameof(message.Payload), message.Payload)
                           .AddParameter(nameof(message.ScheduleDate), (DateTime)message.ScheduleDate)
                           .Execute(context, ReturnIdRow.Read);

                    return(rows.First().Id);
                }

                rows = await new SqlExec(_configuration.SqlConfiguration)
                       .SetCommand("[App].[Enqueue-Message]")
                       .AddParameter(nameof(message.QueueName), message.QueueName)
                       .AddParameter(nameof(message.AgentId), message.AgentId)
                       .AddParameter(nameof(message.ClientMessageId), message.ClientMessageId)
                       .AddParameter(nameof(message.Cv), message.Cv)
                       .AddParameter(nameof(message.Payload), message.Payload)
                       .Execute(context, ReturnIdRow.Read);

                return(rows.First().Id);
            }
            catch (SqlException ex)
            {
                throw new QueueFullException(message.ScheduleDate == null ? "Enqueue" : "Schedule", context, ex);
            }
        }
Exemple #9
0
        public async Task SimpleEnqueueSuccessTest()
        {
            var context = _workContext.WithTag(_tag);

            int agentId = await _utility.SetupAgentAndQueue(_queueName, _agentName);

            InternalEnqueueMessageV1 message = _utility.CreateMessage(context, agentId, _queueName);

            await _message.EnqueueMessage(context, message);

            await _utility.VerifyQueue(context, _queueName, 1, 0);

            InternalMessageV1 readMessage = await _message.DequeueMessageAndDelete(context, _queueName);

            _utility.VerifyMessage(message, readMessage, agentId, false);

            await _utility.VerifyQueue(context, _queueName, 0, 0);

            InternalHistoryV1 history = await _management.GetHistory(context, readMessage.MessageId);

            _utility.VerifyHistoryMessage(readMessage, history, _queueName, _agentName);
        }
Exemple #10
0
        public async Task SimpleEnqueueWithLockTimeoutSuccessTest()
        {
            var context = _workContext.WithTag(_tag);

            int agentId = await _utility.SetupAgentAndQueue(_queueName, _agentName, lockValidForSec : 5);

            InternalEnqueueMessageV1 message = _utility.CreateMessage(context, agentId, _queueName);

            await _message.EnqueueMessage(context, message);

            await _utility.VerifyQueue(context, _queueName, 1, 0);

            InternalMessageV1 readMessage = await _message.DequeueMessageWithLock(context, _queueName, agentId);

            long saveMessageId = readMessage.MessageId;

            _utility.VerifyMessage(message, readMessage, agentId, true);

            InternalMessageV1 tempMessage = await _message.DequeueMessageWithLock(context, _queueName, agentId);

            tempMessage.Should().BeNull();

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

            readMessage = await _message.DequeueMessageWithLock(context, _queueName, agentId);

            _utility.VerifyMessage(message, readMessage, agentId, true);
            readMessage.MessageId.Should().Be(saveMessageId);

            await _message.SettleMessage(context, readMessage.MessageId, agentId, SettleType.Processed);

            await _utility.VerifyQueue(context, _queueName, 0, 0);

            InternalHistoryV1 history = await _management.GetHistory(context, readMessage.MessageId);

            _utility.VerifyHistoryMessage(readMessage, history, _queueName, _agentName, retryCount: 2);
        }
Exemple #11
0
        public async Task MultipleScheduleSuccessTest()
        {
            const int scheduleSize = 10;
            var       context      = _workContext.WithTag(_tag);

            int agentId = await _utility.SetupAgentAndQueue(_queueName, _agentName);

            var list = new List <InternalEnqueueMessageV1>();

            foreach (var item in Enumerable.Range(0, scheduleSize))
            {
                InternalEnqueueMessageV1 message = _utility.CreateMessage(context, agentId, _queueName);
                message.ScheduleDate = DateTime.UtcNow.AddSeconds(2);

                await _message.EnqueueMessage(context, message);

                list.Add(message);
            }

            await _utility.VerifyQueue(context, _queueName, 0, scheduleSize);

            InternalMessageV1 readMessage = await _message.DequeueMessageAndDelete(context, _queueName);

            readMessage.Should().BeNull();

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

            var readList = new List <InternalMessageV1>();

            foreach (var item in Enumerable.Range(0, scheduleSize))
            {
                readMessage = await _message.DequeueMessageAndDelete(context, _queueName);

                readMessage.Should().NotBeNull();

                readList.Add(readMessage);
            }

            readList.Count.Should().Be(scheduleSize);

            readMessage = await _message.DequeueMessageAndDelete(context, _queueName);

            readMessage.Should().BeNull();

            var zip = list
                      .OrderBy(x => x.ClientMessageId)
                      .Zip(readList.OrderBy(x => x.ClientMessageId), (f, s) => new Tuple <InternalEnqueueMessageV1, InternalMessageV1>(f, s));

            foreach (var item in zip)
            {
                _utility.VerifyMessage(item.Item1, item.Item2, agentId, false);
            }

            await _utility.VerifyQueue(context, _queueName, 0, 0);

            foreach (var item in readList)
            {
                InternalHistoryV1 history = await _management.GetHistory(context, item.MessageId);

                _utility.VerifyHistoryMessage(item, history, _queueName, _agentName);
            }
        }