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