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); }
/// <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}"); }