コード例 #1
0
ファイル: ItemConverters.cs プロジェクト: kpocza/thriot
        public static DequeueMessagesDto GetDequeueMessagesDto(IReadOnlyCollection <DequeueResult> dequeueEntries, CacheGetResult cacheItems)
        {
            var dequeueMessages = new DequeueMessagesDto();

            dequeueMessages.Messages = new List <DequeueMessageDto>();
            foreach (var dequeueEntry in dequeueEntries)
            {
                var dequeueMessageDto = new DequeueMessageDto
                {
                    DeviceId  = dequeueEntry.Id,
                    MessageId = dequeueEntry.MessageId,
                };

                bool addItem = false;
                if (dequeueEntry.Payload != null)
                {
                    dequeueMessageDto.Payload        = dequeueEntry.Payload;
                    dequeueMessageDto.TimeStamp      = dequeueEntry.Timestamp;
                    dequeueMessageDto.SenderDeviceId = dequeueEntry.SenderDeviceId;
                    addItem = true;
                }
                else
                {
                    var       key = new CacheIndex(dequeueEntry.Id, dequeueEntry.MessageId);
                    CacheItem cacheItem;
                    if (cacheItems.CacheItems.TryGetValue(key, out cacheItem))
                    {
                        dequeueMessageDto.Payload        = cacheItem.Payload;
                        dequeueMessageDto.TimeStamp      = cacheItem.Timestamp;
                        dequeueMessageDto.SenderDeviceId = cacheItem.SenderDeviceId;
                        addItem = true;
                    }
                }

                if (addItem)
                {
                    dequeueMessages.Messages.Add(dequeueMessageDto);
                }
            }

            return(dequeueMessages);
        }
コード例 #2
0
ファイル: StressLikeTest.cs プロジェクト: kpocza/thriot
        public void EnqueuePeekCommitManyDevicesTest()
        {
            var       dequeueDictionary        = new Dictionary <long, List <string> >();
            var       enqueueDictionary        = new Dictionary <long, List <string> >();
            const int deviceCount              = 100;
            const int dequeueRandomDeviceCount = 30;
            const int enqueueRandomDeviceCount = 5;

            for (int i = 0; i < deviceCount; i++)
            {
                var deviceId = MessagingService.Initialize(Identity.Next());
                dequeueDictionary.Add(deviceId, new List <string>());
                enqueueDictionary.Add(deviceId, new List <string>());
            }

            var deviceIds = dequeueDictionary.Keys.ToList();

            int enqueueCounter          = 0;
            int dequeueCounter          = 0;
            var cancellationTokenSource = new CancellationTokenSource();
            var cancellationToken       = cancellationTokenSource.Token;

            var dequeueThread = new Thread(() =>
            {
                while (!cancellationToken.IsCancellationRequested)
                {
                    DequeueMessagesDto result = MessagingService.Peek(new DeviceListDto()
                    {
                        DeviceIds = GetRandomDevices(deviceIds, dequeueRandomDeviceCount)
                    });
                    MessagingService.Commit(new DeviceListDto
                    {
                        DeviceIds = result.Messages.Select(m => m.DeviceId).ToList()
                    });

                    Interlocked.Add(ref dequeueCounter, result.Messages.Count);
                    foreach (var msg in result.Messages)
                    {
                        dequeueDictionary[msg.DeviceId].Add(Encoding.UTF8.GetString(msg.Payload));
                    }
                }
            });

            var enqueueThread = new Thread(() =>
            {
                while (!cancellationToken.IsCancellationRequested)
                {
                    var randomDeviceIds   = GetRandomDevices(deviceIds, enqueueRandomDeviceCount);
                    var messagesToEnqueue = new EnqueueMessagesDto {
                        Messages = new List <EnqueueMessageDto>()
                    };
                    foreach (var deviceId in randomDeviceIds)
                    {
                        var nextMsgId = enqueueDictionary[deviceId].Count + 1;
                        var nextMsg   = "Stress test message no. " + nextMsgId;
                        enqueueDictionary[deviceId].Add(nextMsg);
                        var msgToEnqueue = new EnqueueMessageDto
                        {
                            DeviceId       = deviceId,
                            Payload        = Encoding.UTF8.GetBytes(nextMsg),
                            TimeStamp      = DateTime.UtcNow,
                            SenderDeviceId = Identity.Next()
                        };
                        messagesToEnqueue.Messages.Add(msgToEnqueue);
                    }

                    var result = MessagingService.Enqueue(messagesToEnqueue);
                    Interlocked.Add(ref enqueueCounter, result.DeviceIds.Count);
                }
            });

            dequeueThread.Start();
            enqueueThread.Start();

            WaitUntil(500, 10000, () => enqueueCounter);
            cancellationTokenSource.Cancel();
            enqueueThread.Join();
            dequeueThread.Join();

            Assert.IsTrue(dequeueCounter > 0);
            Assert.IsTrue(enqueueCounter > 0);
            Assert.IsTrue(enqueueCounter >= dequeueCounter);

            foreach (var deviceId in deviceIds)
            {
                var enqueuedItems = enqueueDictionary[deviceId];
                var dequeuedItems = dequeueDictionary[deviceId];

                Assert.IsTrue(dequeuedItems.Count <= enqueuedItems.Count);
                Assert.IsTrue(dequeuedItems.All(enqueuedItems.Contains));
                var messageNumbers = dequeuedItems.Select(d => int.Parse(d.Substring(d.LastIndexOf(' ')))).ToList();
                Assert.IsTrue(messageNumbers.SequenceEqual(messageNumbers.OrderBy(d => d)));
                Assert.AreEqual(messageNumbers.Count, messageNumbers.Distinct().Count());
            }
        }