private void ProcessMessage(object sender, BasicDeliverEventArgs args) { if (!(sender is EventingBasicConsumer consumer)) { return; } if (!ConsumerTags.TryGetValue(args.ConsumerTag, out string exchange)) { UnsubscribeConsumer(consumer, args.ConsumerTag); return; } JsonDataTransferMessage dataTransferMessage = null; try { byte[] body = args.Body.ToArray(); string messageBody = Encoding.UTF8.GetString(body); dataTransferMessage = JsonSerializer.Deserialize <JsonDataTransferMessage>(messageBody); } catch (Exception error) { FileLogger.Log(LOG_TOKEN, ExceptionHelper.GetErrorText(error)); } if (dataTransferMessage == null) { RemovePoisonMessage(exchange, consumer, args.DeliveryTag); return; } bool success = true; IDatabaseMessageProducer producer = Services.GetService <IDatabaseMessageProducer>(); try { DatabaseMessage message = producer.ProduceMessage(dataTransferMessage); success = producer.InsertMessage(message); if (success) { consumer.Model.BasicAck(args.DeliveryTag, false); } } catch (Exception error) { success = false; FileLogger.Log(LOG_TOKEN, ExceptionHelper.GetErrorText(error)); } if (!success) { ResetConsumer(args.ConsumerTag); // return unacked messages back to queue in the same order (!) FileLogger.Log(LOG_TOKEN, "Failed to process message. Consumer for exchange \"" + exchange + "\" has been reset."); } }
private void ProcessMessage(object sender, BasicDeliverEventArgs args) { if (!(sender is EventingBasicConsumer consumer)) { return; } if (!ConsumerTags.TryGetValue(args.ConsumerTag, out string exchange)) { //TODO: review commented code //UnsubscribeConsumer(consumer, args.ConsumerTag); //return; if (!string.IsNullOrWhiteSpace(args.Exchange)) { exchange = args.Exchange; } else if (!string.IsNullOrWhiteSpace(args.RoutingKey)) { exchange = args.RoutingKey; } else { exchange = "unknown"; } } JsonDataTransferMessage dataTransferMessage = GetJsonDataTransferMessage(args); if (dataTransferMessage == null) { RemovePoisonMessage(exchange, consumer, args.DeliveryTag); return; } bool success = true; IDatabaseMessageProducer producer = Services.GetService <IDatabaseMessageProducer>(); try { DatabaseMessage message = producer.ProduceMessage(dataTransferMessage); success = producer.InsertMessage(message); if (success) { consumer.Model.BasicAck(args.DeliveryTag, false); } } catch (Exception error) { success = false; FileLogger.Log(LOG_TOKEN, ExceptionHelper.GetErrorText(error)); } if (!success) { // return unacked messages back to queue in the same order (!) ResetConsumer(args.ConsumerTag); FileLogger.Log(LOG_TOKEN, "Failed to process message. Consumer (tag = " + args.ConsumerTag.ToString() + ") for exchange \"" + exchange + "\" has been reset."); } }