Задать вопрос
rabbit418
@rabbit418
23 yo Designer from Ukraine

Как в RabbitMQ и PHP вернуть таск в очередь?

Как можно вернуть сообещние обратно в очередь если результат обработки меня не устроил. Находил только информацию про message acknowledgments но думаю что это мне не подходит. Мне нужно чтобы если в результате обработки я получаю параметр RETRY сообщение передобавлялось в очередь. А далее этот воркер или другой подхватывает его снова и пытается обработать.

Напримр так:
<?php
use PhpAmqpLib\Connection\AMQPStreamConnection;

echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

$connection = new AMQPStreamConnection($AMQP);
$channel = $connection->channel();

$channel->queue_declare('test', false, false, false, false);

$callback = function($msg) {
  $condition = json_decode($msg->body);

  if (!$condition) {
    # return to the queue
  }
};

$channel->basic_consume('test', '', false, true, false, false, $callback);

while(count($channel->callbacks)) {
  $channel->wait();
}

$channel->close();
$connection->close();
?>
  • Вопрос задан
  • 1248 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
rabbit418
@rabbit418 Автор вопроса
23 yo Designer from Ukraine
Решение оказалось проще чем я думал, оказывается задача стояла не про RabbitMQ конкретно, а про область видимости переменных. Если кому интересно решение, вот:
<?php
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

$connection = new AMQPStreamConnection($AMQP);
$channel = $connection->channel();

$channel->queue_declare('test', false, false, false, false);

$callback = function($msg) {
  global $channel;

  $condition = json_decode($msg->body);

  if (!$condition) {
    $msg = new AMQPMessage(json_encode(array(
      'condition' => false
    )));

    $channel->basic_publish($msg, '', 'test');
  }
};

$channel->basic_consume('test', '', false, true, false, false, $callback);

while(count($channel->callbacks)) {
  $channel->wait();
}

$channel->close();
$connection->close();
?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
t-alexashka
@t-alexashka
Сразу пишу legacy код
$callback = function($msg) {
    global $channel;

еще можно так:
$callback = function($msg) use ($channel) {
    ...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы