public MessageBus(IStringMinifier stringMinifier, ILoggerFactory loggerFactory, IPerformanceCounterManager performanceCounterManager, IOptions <MessageBusOptions> optionsAccessor) { if (stringMinifier == null) { throw new ArgumentNullException("stringMinifier"); } if (loggerFactory == null) { throw new ArgumentNullException("traceManager"); } if (performanceCounterManager == null) { throw new ArgumentNullException("performanceCounterManager"); } if (optionsAccessor == null) { throw new ArgumentNullException("optionsAccessor"); } var options = optionsAccessor.Value; if (options.MessageBufferSize < 0) { throw new ArgumentOutOfRangeException(Resources.Error_BufferSizeOutOfRange); } _stringMinifier = stringMinifier; _loggerFactory = loggerFactory; Counters = performanceCounterManager; _logger = _loggerFactory.CreateLogger <MessageBus>(); _maxTopicsWithNoSubscriptions = options.MaxTopicsWithNoSubscriptions; _gcTimer = new Timer(_ => GarbageCollectTopics(), state: null, dueTime: _gcInterval, period: _gcInterval); _broker = new MessageBroker(Counters) { Logger = _logger }; // The default message store size _messageStoreSize = (uint)options.MessageBufferSize; _topicTtl = options.TopicTTL; _createTopic = CreateTopic; _addEvent = AddEvent; _removeEvent = RemoveEvent; _disposeSubscription = o => DisposeSubscription(o); Topics = new TopicLookup(); }
private static ulong GetMessageId(TopicLookup topics, string key) { Topic topic; if (topics.TryGetValue(key, out topic)) { return(GetMessageId(topic)); } return(0); }
private List <Cursor> GetCursorsFromEventKeys(IList <string> eventKeys, TopicLookup topics) { var list = new List <Cursor>(eventKeys.Count); foreach (var eventKey in eventKeys) { var cursor = new Cursor(eventKey, GetMessageId(topics, eventKey), _stringMinifier.Minify(eventKey)); list.Add(cursor); } return(list); }
public DefaultSubscription(string identity, IList <string> eventKeys, TopicLookup topics, string cursor, Func <MessageResult, object, Task <bool> > callback, int maxMessages, IStringMinifier stringMinifier, IPerformanceCounterManager counters, object state) : base(identity, eventKeys, callback, maxMessages, counters, state) { _stringMinifier = stringMinifier; if (String.IsNullOrEmpty(cursor)) { _cursors = GetCursorsFromEventKeys(EventKeys, topics); } else { // Ensure delegate continues to use the C# Compiler static delegate caching optimization. _cursors = Cursor.GetCursors(cursor, _defaultCursorPrefix, (k, s) => UnminifyCursor(k, s), stringMinifier) ?? GetCursorsFromEventKeys(EventKeys, topics); } _cursorTopics = new List <Topic>(); if (!String.IsNullOrEmpty(cursor)) { // Update all of the cursors so we're within the range for (int i = _cursors.Count - 1; i >= 0; i--) { Cursor c = _cursors[i]; Topic topic; if (!EventKeys.Contains(c.Key)) { _cursors.Remove(c); } else if (!topics.TryGetValue(_cursors[i].Key, out topic) || _cursors[i].Id > topic.Store.GetMessageCount()) { UpdateCursor(c.Key, 0); } } } // Add dummy entries so they can be filled in for (int i = 0; i < _cursors.Count; i++) { _cursorTopics.Add(null); } }