public void WireUpContextFeatures <TMessageContext>(TMessageContext context, IRawConsumer consumer, BasicDeliverEventArgs args) where TMessageContext : IMessageContext { var advancedCtx = context as IAdvancedMessageContext; if (advancedCtx == null) { return; } advancedCtx.Nack = () => { consumer.AcknowledgedTags.Add(args.DeliveryTag); consumer.Model.BasicNack(args.DeliveryTag, false, true); }; advancedCtx.RetryLater = timespan => { var dlxName = _conventions.RetryLaterExchangeConvention(timespan); var dlQueueName = _conventions.RetryLaterExchangeConvention(timespan); var channel = _channelFactory.CreateChannel(); channel.ExchangeDeclare(dlxName, ExchangeType.Direct, true, true, null); channel.QueueDeclare(dlQueueName, true, false, true, new Dictionary <string, object> { { QueueArgument.DeadLetterExchange, args.Exchange }, { QueueArgument.Expires, Convert.ToInt32(timespan.Add(TimeSpan.FromSeconds(1)).TotalMilliseconds) }, { QueueArgument.MessageTtl, Convert.ToInt32(timespan.TotalMilliseconds) } }); channel.QueueBind(dlQueueName, dlxName, args.RoutingKey, null); UpdateHeaders(args.BasicProperties); channel.BasicPublish(dlxName, args.RoutingKey, args.BasicProperties, args.Body); channel.QueueUnbind(dlQueueName, dlxName, args.RoutingKey, null); }; advancedCtx.RetryInfo = GetRetryInformatino(args.BasicProperties); }
protected virtual string GetDeadLetterExchangeName(TimeSpan retryIn) { return(Conventions.RetryLaterExchangeConvention(retryIn)); }