private void ShutdownInternal(bool force = false) { Logger.Info($"Shutdown received for simple consumer on {_topic} with force:{force}"); if (!_running) { return; } lock (Lock) { if (!_running) { return; } if (_forceShutdown) { return; } _forceShutdown = force; var c = _consumer; _consumer = null; c?.Dispose(); } }
public void Start(Action <ConsumedMessage> dataSubscriber, Action <Exception> errorSubscriber = null, Action closeAction = null) { if (_running) { return; } do { if (_restart) { Task.Delay(5000).Wait(); } lock (Lock) { _restart = false; try { Logger.Info($"Starting simple consumer for {_topic}."); _consumer = _client.SimpleConsumer(); if (_partitions == null) { Logger.Info("Determining partitions from metadata."); var meta = _client.Topic(_topic).GetMetadata(); _partitions = meta.PartitionsMetadata.Select(p => p.PartitionId).ToArray(); } Logger.Info($"Subscribing to {_topic} partitions {string.Join(",", _partitions)}"); _streams = _partitions .Select(p => _consumer.Subscribe(_topic, p, (long)Offset.Latest)) .ToArray(); foreach (var stream in _streams) { stream.Data(dataSubscriber); if (errorSubscriber != null) { stream.Error(errorSubscriber); } stream.Start(); } Logger.Info($"Simple consumer started with {_streams.Count()} threads."); _running = true; } catch (Exception ex) { Logger.Error($"Exception starting simple consumer for {_topic}. Restarting...", ex); Restart(); continue; } } _streams?.ForEach(s => s.Block()); Logger.Info($"Simple consumer for {_topic} shut down."); } while (_restart); closeAction?.Invoke(); _running = false; }