コード例 #1
0
        private async Task TratarMensagem(BasicDeliverEventArgs ea)
        {
            var mensagem = Encoding.UTF8.GetString(ea.Body.Span);
            var rota     = ea.RoutingKey;

            Console.WriteLine(string.Concat(rota, " - ", DateTime.Now.ToString("G")));
            if (comandos.ContainsKey(rota))
            {
                var mensagemRabbit = JsonConvert.DeserializeObject <MensagemRabbit>(mensagem);
                var comandoRabbit  = comandos[rota];
                var tempoExecucao  = Stopwatch.StartNew();
                try
                {
                    if (telemetriaOptions.Apm)
                    {
                        Agent.Tracer.StartTransaction("TratarMensagem", "WorkerRabbitGCA");
                    }

                    using var scope = serviceScopeFactory.CreateScope();
                    var casoDeUso = scope.ServiceProvider.GetService(comandoRabbit.TipoCasoUso);

                    metricReporter.RegistrarExecucao(casoDeUso.GetType().Name);
                    await servicoTelemetria.RegistrarAsync(async() =>
                                                           await ObterMetodo(comandoRabbit.TipoCasoUso, "Executar").InvokeAsync(casoDeUso, new object[] { mensagemRabbit }),
                                                           "WorkerRabbitGCA",
                                                           "TratarMensagem",
                                                           rota);

                    canalRabbit.BasicAck(ea.DeliveryTag, false);
                }
                catch (NegocioException nex)
                {
                    canalRabbit.BasicReject(ea.DeliveryTag, false);
                    metricReporter.RegistrarErro(comandoRabbit.TipoCasoUso.Name, nameof(NegocioException));
                    RegistrarErro(ea, mensagemRabbit, nex, LogNivel.Negocio);
                }
                catch (ValidacaoException vex)
                {
                    canalRabbit.BasicReject(ea.DeliveryTag, false);
                    metricReporter.RegistrarErro(comandoRabbit.TipoCasoUso.Name, nameof(ValidacaoException));
                    RegistrarErro(ea, mensagemRabbit, vex, LogNivel.Negocio);
                }
                catch (Exception ex)
                {
                    canalRabbit.BasicReject(ea.DeliveryTag, false);
                    metricReporter.RegistrarErro(comandoRabbit.TipoCasoUso.Name, ex.GetType().Name);
                    RegistrarErro(ea, mensagemRabbit, ex, LogNivel.Critico);
                }
                finally
                {
                    tempoExecucao.Stop();
                    metricReporter.RegistrarTempoDeExecucao(comandoRabbit.TipoCasoUso.Name, tempoExecucao.Elapsed);
                }
            }
            else
            {
                canalRabbit.BasicReject(ea.DeliveryTag, false);
            }
        }