コード例 #1
0
        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);
        }
コード例 #2
0
 protected virtual string GetDeadLetterExchangeName(TimeSpan retryIn)
 {
     return(Conventions.RetryLaterExchangeConvention(retryIn));
 }