async Task <List <string> > PrepareTopicHashSubscriptions(TopicHashSelector selector)
        {
            Dictionary <string, List <string> > topicsByPublisher;
            Dictionary <string, List <string> > singleWildcardTopicsByPublisher;
            Dictionary <string, List <string> > multiWildcardTopicsByPublisher;

            const int NumPublishers         = 1;
            const int NumTopicsPerPublisher = 10000;

            TopicGenerator.Generate(NumPublishers, NumTopicsPerPublisher, out topicsByPublisher, out singleWildcardTopicsByPublisher, out multiWildcardTopicsByPublisher);

            var topics = topicsByPublisher.FirstOrDefault().Value;
            var singleWildcardTopics = singleWildcardTopicsByPublisher.FirstOrDefault().Value;
            var multiWildcardTopics  = multiWildcardTopicsByPublisher.FirstOrDefault().Value;

            const string ClientId                = "Client1";
            var          logger                  = new Mockups.TestLogger();
            var          serverOptions           = new MQTTnet.Server.MqttServerOptions();
            var          eventContainer          = new MQTTnet.Server.MqttServerEventContainer();
            var          retainedMessagesManager = new MqttRetainedMessagesManager(eventContainer, logger);
            var          sessionManager          = new MqttClientSessionsManager(serverOptions, retainedMessagesManager, eventContainer, logger);

            _clientSession = new MQTTnet.Server.MqttSession(
                ClientId,
                false,
                new Dictionary <object, object>(),
                serverOptions,
                eventContainer,
                retainedMessagesManager,
                sessionManager
                );

            List <string> topicsToSubscribe;

            switch (selector)
            {
            case TopicHashSelector.SingleWildcard:
                topicsToSubscribe = singleWildcardTopics;
                break;

            case TopicHashSelector.MultiWildcard:
                topicsToSubscribe = multiWildcardTopics;
                break;

            default:
                topicsToSubscribe = topics;
                break;
            }
            foreach (var t in topicsToSubscribe)
            {
                var subPacket = new Packets.MqttSubscribePacket();
                var filter    = new Packets.MqttTopicFilter();
                filter.Topic = t;
                subPacket.TopicFilters.Add(filter);
                await _clientSession.SubscriptionsManager.Subscribe(subPacket, default(CancellationToken));
            }

            return(topics);
        }
Пример #2
0
        /// <summary>
        ///  Subscribe to all topics, then run message exchange
        /// </summary>
        public async Task ProcessMessages(Dictionary <string, List <string> > topicsByPublisher, string topicTypeDescription)
        {
            var numTopics = CountTopics(topicsByPublisher);

            Console.WriteLine();
            Console.Write($"Subscribing to {numTopics} topics ");
            ConsoleWriteInfo($"({topicTypeDescription})");
            Console.WriteLine($" for {NumSubscribers} subscriber(s)...");

            var stopWatch = new System.Diagnostics.Stopwatch();

            stopWatch.Start();

            // each subscriber subscribes to all topics, one call per topic
            foreach (var subscriber in _mqttSubscriberClients)
            {
                foreach (var tp in topicsByPublisher)
                {
                    var topics = tp.Value;
                    foreach (var topic in topics)
                    {
                        var topicFilter = new Packets.MqttTopicFilter()
                        {
                            Topic = topic
                        };
                        await subscriber.SubscribeAsync(topicFilter).ConfigureAwait(false);
                    }
                }
            }

            stopWatch.Stop();

            Console.Write($"{NumSubscribers} subscriber(s) subscribed in {stopWatch.ElapsedMilliseconds / 1000.0:0.000} seconds, ");
            Console.WriteLine($"subscribe calls per second: {numTopics / (stopWatch.ElapsedMilliseconds / 1000.0):0.000}");

            await PublishAllAsync();

            Console.WriteLine($"Unsubscribing {numTopics} topics ({topicTypeDescription}) for {NumSubscribers} subscriber(s)...");

            stopWatch.Restart();

            // unsubscribe to all topics, one call per topic
            foreach (var subscriber in _mqttSubscriberClients)
            {
                foreach (var tp in topicsByPublisher)
                {
                    var topics = tp.Value;
                    foreach (var topic in topics)
                    {
                        var topicFilter = new Packets.MqttTopicFilter()
                        {
                            Topic = topic
                        };

                        MqttClientUnsubscribeOptions options =
                            new MqttClientUnsubscribeOptionsBuilder()
                            .WithTopicFilter(topicFilter)
                            .Build();
                        await subscriber.UnsubscribeAsync(options).ConfigureAwait(false);
                    }
                }
            }

            stopWatch.Stop();

            Console.Write($"{NumSubscribers} subscriber(s) unsubscribed in {stopWatch.ElapsedMilliseconds / 1000.0:0.000} seconds, ");
            Console.WriteLine($"unsubscribe calls per second: {numTopics / (stopWatch.ElapsedMilliseconds / 1000.0):0.000}");
        }