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