private void RefreshTopicPartition() { try { if (Interlocked.Increment(ref _ensureOneThread) == 1) { var topic = _options.Router.GetTopicMetadata(_options.Topic); if (topic.Count <= 0) { throw new ApplicationException(string.Format("Unable to get metadata for topic:{0}.", _options.Topic)); } _topic = topic.First(); //create one thread per partitions, if they are in the white list. foreach (var partition in _topic.Partitions) { var partitionId = partition.PartitionId; if (_options.PartitionWhitelist.Count == 0 || _options.PartitionWhitelist.Any(x => x == partitionId)) { Func <int, PartitionConsumer> addValueFactory = _ => { var partitionConsumer = new PartitionConsumer( _options, _topic.Name, partitionId, message => _fetchResponseQueue.Add(message)); partitionConsumer.Start(); return(partitionConsumer); }; this._partitionPollingIndex.AddOrUpdate(partitionId, addValueFactory, (i, consumer) => consumer); } } } } catch (Exception ex) { _options.Log.ErrorFormat("Exception occured trying to setup consumer for topic:{0}. Exception={1}", _options.Topic, ex); } finally { Interlocked.Decrement(ref _ensureOneThread); } }
private void RefreshTopicPartition() { try { if (Interlocked.Increment(ref _ensureOneThread) == 1) { var topic = _options.Router.GetTopicMetadata(_options.Topic); if (topic.Count <= 0) throw new ApplicationException(string.Format("Unable to get metadata for topic:{0}.", _options.Topic)); _topic = topic.First(); //create one thread per partitions, if they are in the white list. foreach (var partition in _topic.Partitions) { var partitionId = partition.PartitionId; if (_options.PartitionWhitelist.Count == 0 || _options.PartitionWhitelist.Any(x => x == partitionId)) { Func<int, PartitionConsumer> addValueFactory = _ => { var partitionConsumer = new PartitionConsumer( _options, _topic.Name, partitionId, message => _fetchResponseQueue.Add(message)); partitionConsumer.Start(); return partitionConsumer; }; this._partitionPollingIndex.AddOrUpdate(partitionId, addValueFactory, (i, consumer) => consumer); } } } } catch (Exception ex) { _options.Log.ErrorFormat("Exception occured trying to setup consumer for topic:{0}. Exception={1}", _options.Topic, ex); } finally { Interlocked.Decrement(ref _ensureOneThread); } }