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); } }