/// <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); }