コード例 #1
0
        private async Task Consumer_Received(object sender, BasicDeliverEventArgs e)
        {
            var consumerTag           = e.ConsumerTag;
            var routingKeyOrQueueName = e.RoutingKey;
            var exchange = e.Exchange;
            var message  = "";

            try
            {
                message = Encoding.UTF8.GetString(e.Body.Span.ToArray());

                var consumer = (AsyncEventingBasicConsumerExtended)sender;

                consumer.LastMessageDate = DateTime.Now;

                var firstErrorTimestamp = RabbitMqUtilities.GetFirstErrorTimeStampFromMessageArgs(e.BasicProperties);
                var additionalInfo      = RabbitMqUtilities.GetAdditionalInfoFromMessageArgs(e.BasicProperties);

                var model = consumer.Model;

                var messageProcessInstruction = await GetMessageProcessInstruction(routingKeyOrQueueName, consumerTag, firstErrorTimestamp, exchange, message, additionalInfo).ConfigureAwait(false);

                switch (messageProcessInstruction.Value)
                {
                case Constants.MessageProcessInstruction.OK:
                    model.BasicAck(e.DeliveryTag, false);
                    break;

                case Constants.MessageProcessInstruction.IgnoreMessage:
                    model.BasicReject(e.DeliveryTag, false);
                    break;

                case Constants.MessageProcessInstruction.IgnoreMessageWithRequeue:
                    model.BasicReject(e.DeliveryTag, true);
                    break;

                case Constants.MessageProcessInstruction.RequeueMessageWithDelay:
                    RequeueMessageWithDelay(consumer, e, messageProcessInstruction.AdditionalInfo);
                    model.BasicReject(e.DeliveryTag, false);
                    break;

                default:
                    model.BasicAck(e.DeliveryTag, false);
                    break;
                }
            }
            catch (Exception ex)
            {
                await OnMessageReceiveError(routingKeyOrQueueName, consumerTag, exchange, message, ex.Message)
                .ConfigureAwait(false);
            }
        }
コード例 #2
0
        private void RequeueMessageWithDelay(AsyncEventingBasicConsumerExtended consumer, BasicDeliverEventArgs deliveryArgs, string messageAdditionalInfo)
        {
            if (string.IsNullOrWhiteSpace(consumer.RetryQueue))
            {
                return;
            }

            var properties = consumer.Model.CreateBasicProperties();

            RabbitMqUtilities.SetPropertiesSenderRequeueMessageWithDelay(properties, consumer.RetentionPeriodInRetryQueueMilliseconds, consumer.RetentionPeriodInRetryQueueMillisecondsMax);

            var firstErrorTimeStamp = RabbitMqUtilities.GetFirstErrorTimeStampFromMessageArgs(deliveryArgs.BasicProperties);

            SetFirstErrorTimeStampToProperties(firstErrorTimeStamp, properties);
            SetMessageAdditionalInfoToProperties(messageAdditionalInfo, properties);

            consumer.Model.BasicPublish(
                "",
                consumer.RetryQueue,
                properties,
                deliveryArgs.Body);
        }