Esempio n. 1
0
 /**
  * Синхронный вызов
  * @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;
 }