Пример #1
0
        /// <summary>
        /// Schedule a message to be published at some time in the future.
        /// </summary>
        /// <typeparam name="T">The message type</typeparam>
        /// <param name="bus">The IBus instance to publish on</param>
        /// <param name="messageDelay">The delay time for message to publish in future</param>
        /// <param name="message">The message to response with</param>
        public static Task FuturePublishAsync <T>(this IBus bus, TimeSpan messageDelay, T message) where T : class
        {
            Preconditions.CheckNotNull(message, "message");
            Preconditions.CheckLess(messageDelay, MaxMessageDelay, "messageDelay");
            var advancedBus = bus.Advanced;
            var conventions = advancedBus.Container.Resolve <IConventions>();
            var messageDeliveryModeStrategy = advancedBus.Container.Resolve <IMessageDeliveryModeStrategy>();
            var delay              = Round(messageDelay);
            var delayString        = delay.ToString(@"dd\_hh\_mm\_ss");
            var exchangeName       = conventions.ExchangeNamingConvention(typeof(T));
            var futureExchangeName = exchangeName + "_" + delayString;
            var futureQueueName    = conventions.QueueNamingConvention(typeof(T), delayString);

            return(advancedBus.ExchangeDeclareAsync(futureExchangeName, ExchangeType.Topic)
                   .Then(futureExchange => advancedBus.QueueDeclareAsync(futureQueueName, perQueueTtl: (int)delay.TotalMilliseconds, deadLetterExchange: exchangeName)
                         .Then(futureQueue => advancedBus.BindAsync(futureExchange, futureQueue, "#"))
                         .Then(() =>
            {
                var easyNetQMessage = new Message <T>(message)
                {
                    Properties =
                    {
                        DeliveryMode = (byte)(messageDeliveryModeStrategy.IsPersistent(typeof(T)) ? 2 : 1)
                    }
                };
                return bus.Advanced.PublishAsync(futureExchange, "#", false, false, easyNetQMessage);
            })));
        }
Пример #2
0
        public Task FuturePublishAsync <T>(TimeSpan messageDelay, T message) where T : class
        {
            Preconditions.CheckNotNull(message, "message");
            Preconditions.CheckLess(messageDelay, MaxMessageDelay, "messageDelay");
            var delay              = Round(messageDelay);
            var delayString        = delay.ToString(@"dd\_hh\_mm\_ss");
            var exchangeName       = conventions.ExchangeNamingConvention(typeof(T));
            var futureExchangeName = exchangeName + "_" + delayString;
            var futureQueueName    = conventions.QueueNamingConvention(typeof(T), delayString);

            return(advancedBus.ExchangeDeclareAsync(futureExchangeName, ExchangeType.Topic)
                   .Then(futureExchange => advancedBus.QueueDeclareAsync(futureQueueName, perQueueTtl: (int)delay.TotalMilliseconds, deadLetterExchange: exchangeName)
                         .Then(futureQueue => advancedBus.BindAsync(futureExchange, futureQueue, "#"))
                         .Then(() =>
            {
                var easyNetQMessage = new Message <T>(message)
                {
                    Properties =
                    {
                        DeliveryMode = messageDeliveryModeStrategy.GetDeliveryMode(typeof(T))
                    }
                };
                return advancedBus.PublishAsync(futureExchange, "#", false, false, easyNetQMessage);
            })));
        }