예제 #1
0
        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();
            }
        }
예제 #2
0
        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;
        }