示例#1
0
        /// <summary>
        /// Объявить очередь с отложенным паблишем.
        /// </summary>
        /// <param name="channel">Канал.</param>
        /// <param name="messageType">Тип сообщения.</param>
        /// <param name="exchange">Тип обменника.</param>
        /// <param name="routingKey">Роут.</param>
        /// <param name="publishDelay">Период на которую откладывается паблиш.</param>
        /// <returns>Название очереди с отложенным паблишем.</returns>
        public string?DeclareDelayedPublishQueue(
            IModel channel,
            Type messageType,
            string exchange,
            string routingKey,
            TimeSpan publishDelay
            )
        {
            if (publishDelay == TimeSpan.Zero)
            {
                return(null);
            }

            var delayedQueueName = _namingConvention.DelayedPublishQueueNamingConvention(messageType, publishDelay);

            // TODO: проверить DelayedPublish для HeaderExchange

            channel.QueueDeclare(
                queue: delayedQueueName,
                durable: true,
                exclusive: false,
                autoDelete: false,
                arguments: new Dictionary <string, object>
            {
                // автоматически будет переслан в тот обменник и RoutingKey, который был изначально указан
                [QueueArgument.DEAD_LETTER_EXCHANGE]    = exchange,
                [QueueArgument.DEAD_LETTER_ROUTING_KEY] = routingKey,
                [QueueArgument.EXPIRES] =
                    Convert.ToInt32(publishDelay.Add(TimeSpan.FromSeconds(10)).TotalMilliseconds),
                [QueueArgument.MESSAGE_TTL] = Convert.ToInt32(publishDelay.TotalMilliseconds)
            }
                );

            return(delayedQueueName);
        }