/** * @return \AMQPChannel */ public function getChanel() { if ($this->chanel === null) { $connection = $this->amqp->getConnection(); $this->chanel = new \AMQPChannel($connection); } return $this->chanel; }
/** * Асинхронное чтение ответов * @param string $transactionId * @param callable $callBack - Функция вызываемая для каждой строки. * Приимвет два параметра * \AMQPEnvelope $envelope * \AMQPQueue $queue * Чтобы подтвердить получение нужно вызвать метод $queue->ack($envelope->getDeliveryTag()); * Чтобы перейти к следующему элементу без подтверждения получения нужно вызвать метод $queue->cancel($envelope->getDeliveryTag()); * Если возвращает false, то передор возвращается. * @return \AMQPQueue - Возвращает очередь чтобы ее можно было удалить, если она уже не нужна * @throws \Exception */ public function asyncRead($transactionId, $callBack) { if (!is_callable($callBack)) { throw new \Exception('Callback not callable'); } $chanel = $this->amqp->newChannel(); $queue = new \AMQPQueue($chanel); $queue->setName($transactionId); // Таким образом можно проверить существует ли очередь. // Если она не существует, то будет ошибка и нужно вернуть пустой ответ $queue->setFlags(AMQP_PASSIVE); try { $queue->declareQueue(); } catch (\Exception $e) { return $queue; } /** @var \AMQPEnvelope $envelop */ while ($envelop = $queue->get()) { if (call_user_func($callBack, $envelop, $queue) === false) { break; } } return $queue; }