Exemplo n.º 1
0
        internal static IReadOnlyCollection <EnqueueItem> ToEnqueueItemList(EnqueueMessagesDto messages)
        {
            var enqueueItems = new List <EnqueueItem>();

            foreach (var msg in messages.Messages)
            {
                enqueueItems.Add(new EnqueueItem
                {
                    DeviceId       = msg.DeviceId,
                    Payload        = msg.Payload,
                    Timestamp      = msg.TimeStamp,
                    SenderDeviceId = msg.SenderDeviceId
                });
            }
            return(enqueueItems);
        }
Exemplo n.º 2
0
        public DeviceListDto Enqueue(EnqueueMessagesDto messages)
        {
            EnsureSingleDevice(messages.Messages.Select(m => m.DeviceId));

            var enqueueItems = ItemConverters.ToEnqueueItemList(messages);

            var deviceEntries = _persistentStorage.Enqueue(enqueueItems);

            var cacheItems = ItemConverters.ToCacheItems(deviceEntries, enqueueItems);

            _messageCache.Put(cacheItems);

            DeviceEntryRegistry.Instance.Merge(deviceEntries);

            return(ItemConverters.ToDeviceListDto(deviceEntries));
        }
Exemplo n.º 3
0
        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());
            }
        }
Exemplo n.º 4
0
 public DeviceListDto Enqueue([FromBody] EnqueueMessagesDto enqueueMessages)
 {
     return(_messagingService.Enqueue(enqueueMessages));
 }