Exemple #1
0
        public async Task IniciarConsumo(CancellationTokenSource cts)
        {
            //para permitir que em caso de erro, não realizar commit para não perder a mensagem
            _brokerHelper.ConsumerConfig.EnableAutoCommit = false;
            _brokerHelper.ConsumerConfig.AutoOffsetReset  = AutoOffsetReset.Earliest;
            _brokerHelper.ConsumerConfig.GroupId          = _consumerGroup;

            using (var consumer = new ConsumerBuilder <string, string>(_brokerHelper.ConsumerConfig).Build())
            {
                consumer.Subscribe(_topico);

                var fakeDatabase = new FakeDatabase(_messageWriter);

                while (!cts.IsCancellationRequested)
                {
                    try
                    {
                        var cr = consumer.Consume(cts.Token);
                        _messageWriter.Write($"Consumiu (key : message): {cr.Message.Key} : {cr.Message.Value} no offset {cr.Offset}", MessageType.Output);

                        fakeDatabase.BeginTransaction();

                        if (SimularProcessamentoBemSucedido())
                        {
                            _messageWriter.Write($"Processou com sucesso e realizou commit do offset {cr.Offset}", MessageType.Output);
                            fakeDatabase.Commit();
                            consumer.Commit(cr);
                        }
                        else
                        {
                            _messageWriter.Write($"Erro no processamento pós consumo. Não realizou commit do offset {cr.Offset}", MessageType.Output);
                            fakeDatabase.Rollback();
                            consumer.Subscribe(_topico); //forçar recomeçar a leitura a partir do último registro commited
                        }
                        await Task.Delay(1000);
                    }
                    catch (ConsumeException e)
                    {
                        _messageWriter.Write($"Falha no consumo: {e.Error.Reason}", MessageType.Input);
                    }
                }
            }
        }