/// <summary> /// Объявить очередь с отложенной обработкой. /// </summary> /// <param name="channel">Канал.</param> /// <param name="settings">Настройки подписчика.</param> /// <param name="messageType">Тип сообщения.</param> /// <param name="retryDelay">Период на которую откладывается обработка.</param> /// <returns>Название очереди с отложенной обработкой.</returns> public string DeclareDelayedQueue(IModel channel, SubscriberSettings settings, Type messageType, TimeSpan retryDelay) { var queueName = _namingConvention.QueueNamingConvention(messageType, settings); var delayedQueueName = _namingConvention.DelayedQueueNamingConvention(messageType, settings, retryDelay); channel.QueueDeclare( queue: delayedQueueName, // персистентность сообщений должна быть как у основной очереди. durable: settings.Durable, exclusive: false, autoDelete: false, arguments: new Dictionary <string, object> { // для отправки в основную очередь используется обменник по-умолчанию. [QueueArgument.DEAD_LETTER_EXCHANGE] = string.Empty, // сообщения будут возвращаться обратно в основную очередь по названию. [QueueArgument.DEAD_LETTER_ROUTING_KEY] = queueName, [QueueArgument.EXPIRES] = Convert.ToInt32(retryDelay.Add(TimeSpan.FromSeconds(10)).TotalMilliseconds), [QueueArgument.MESSAGE_TTL] = Convert.ToInt32(retryDelay.TotalMilliseconds) } ); return(delayedQueueName); }