/** * Синхронный вызов * @param $service * @param $message * @return \AMQPEnvelope * @throws \Exception */ public function syncCall($service, $message) { if (is_array($message) || is_object($message)) { $message = Json::encode($message); } // id этого запроса $correlationId = self::$syncCallCorrelationId++; $chanel = $this->amqp->newChannel(); // Принимать неограниченное количество сообщений $chanel->qos(0, 0); //<editor-fold desc="Создаем временную очередь ответов"> $queue = new \AMQPQueue($chanel); $queue->setName($this->amqp->getSyncCallTransactionId()); // Очередь удалиться когда опустеет $queue->setFlags(AMQP_AUTODELETE | AMQP_EXCLUSIVE); $queue->declareQueue(); //</editor-fold> //<editor-fold desc="Отправляем запрос на обработку"> // Точка доступа $exchange = new \AMQPExchange($chanel); $attributes = array('reply_to' => $this->amqp->getSyncCallTransactionId(), 'correlation_id' => $correlationId); if (!$exchange->publish($message, $service, AMQP_NOPARAM, $attributes)) { throw new \Exception('Exchange publish error'); } //</editor-fold> //<editor-fold desc="Ожидаем ответ"> /** * @param \AMQPEnvelope $envelope * @param \AMQPQueue $queue * @return bool */ $processMessage = function ($envelope, $queue) use($correlationId, &$r) { if ($envelope->getCorrelationId() == $correlationId) { $r = $envelope; return false; } return true; }; $queue->consume($processMessage); //</editor-fold> return $r; }