RabbitMQ поддерживает время истечения для очередей (или очередей TTL).
Как объяснено в документации RabbitMQ, Время истечения может быть довольно легко установить для данной очереди, установив x-expires
аргумент queue_declare
метод.
Для отправки сообщений я объявляю очередь, а затем отправляю сообщения, используя basic_publish
метод.
Однако мой отправляющий код «касается» истечения очереди — когда сообщение отправляется, время истечения сбрасывается до его первоначального значения (в моем примере 30 секунд).
Это простой пример того, как я создаю очередь:
$connection = new AMQPConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
// queueKey is given as first arg
$queueName = $argv[1];
// auto-delete the queue after x ms
$channel->queue_declare($queueName, false, true, false, false, false,
new AMQPTable(array("x-expires" => 30000 ))
);
И вот как я отправляю сообщения:
$channel->queue_declare($queueName, true, true, false, false, false,
new AMQPTable(array("x-expires" => 30000 ))); // auto-delete the queue after x ms
// mark messages as persistent
$msg = new AMQPMessage($data, array(
'delivery_mode' => 2
));
// pushing the message to the queue
$channel->basic_publish($msg, '', $queueName);
Есть ли способ не трогать время истечения при отправке сообщений? Я хочу, чтобы время истечения было затронуто только тогда, когда кто-то действительно потребляет сообщения (т.е. есть потребители), а не после отправки. Я имею в виду, что когда «кто-то» отправляет сообщения, я ожидаю, что мой 30-секундный таймер не будет сброшен.
Спасибо!
Как у вас работает скрипт, который публикует сообщения?
Неиспользованный означает, что очередь […] не была повторно объявлена
Так что, если вы продолжаете звонить queue_declare
в вашем коде каждый раз, когда вы запускаете вашего производителя, таймер будет сброшен.
Вы можете объявить очередь в отдельном скрипте, и тогда ваш продюсер не выдаст queue_declare
,
Других решений пока нет …