Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Обмен сообщениями по протоколу AMQP

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Двусторонний обмен сообщениями по протоколу AMQP с использованием фреймворка Yii
pioneer
Отправлено: 03 Июля, 2016 - 15:09:41
Post Id


Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




Всем привет!

Собственно, задача такова: "подружить" 2 сайта на Yii посредством протокола AMQP и клиента RabbitMQ в частности, конкретнее - для передачи новых данных (будем передавать сериализованные атрибуты модели) с одного сайта на другой, на котором будет производиться анализ и модерация этих данных с последующим принятием или отклонением (с оповещением первого сайта). То есть проще говоря "общение" между сайтами должно быть в двустороннем порядке.

Итак, ближе к делу. Все настройки по установке и инициализации RabbitMQ я выполнил (следуя инструкциям этой статьи), убедившись в работоспособности сервера (на тестовом примере с передачей сообщения 'Hello, buddy!'). Однако на практике столкнулся со следующей проблемой: в методе afterSave() модели (атрибуты которой нужно отправлять) прописал вызов функции, которая будет отвечать за отправку данных на "модерирующий" сайт; на сайте-получателе создал команду наследующую CConsoleCommand, по исполнении которой и должен произойти прием нужных данных с сохранением, однако консоль выбрасывает вот это исключение: exception 'AMQPQueueException' with message 'Server channel error: 404, message: NOT_FOUND - no exchange 'amq.product' in vhost '/'' in...

Теперь по коду. В модели откуда отправляются данные:
PHP:
скопировать код в буфер обмена
  1. public function afterSave()
  2. {
  3.     $this->sendRabbit();
  4. }
  5. public function sendRabbit()
  6. {
  7.     $data['model_name'] = get_class($this);
  8.     $data['model_id'] = $this->id;
  9.     $data['data'] = $this->attributes;
  10.  
  11.     $rabbit = new RabbitSender();
  12.     if ($rabbit->send('amq.product', 'send_product_data', serialize($data))) {
  13.         return true;
  14.     }
  15.  
  16.     return false;
  17.  
  18. }

И тут же вот такой незамысловатый компонент для отправки сообщений:
PHP:
скопировать код в буфер обмена
  1. class RabbitSender
  2. {
  3.     public $connection;
  4.  
  5.     function __construct()
  6.     {
  7.         $this->connection = new AMQPConnection(Yii::app()->params['amqp_connection']);
  8.         $this->connection->connect();
  9.     }
  10.  
  11.     public function send($exchange_name, $routing_key, $message)
  12.     {
  13.         $channel = new AMQPChannel($this->connection);
  14.         $exchange = new AMQPExchange($channel);
  15.  
  16.         $exchange->setName($exchange_name);
  17.         if ($exchange->publish($message, $routing_key)) {
  18.             $result = true;
  19.         } else {
  20.             $result = false;
  21.         }
  22.  
  23.         $this->connection->disconnect();
  24.  
  25.         return $result;
  26.     }
  27. }

Кстати, попутно вопрос (из документации если честно так и не понял этот момент): на сайтах нужно обязательно указывать одинаковые настройки подключения к AMQP или для каждого свои? Упомяну также, что пару guest/guest я не использовал (хотя и с ней пробовал - ситуация с исключением та же), поскольку в курсе, что она работает только в пределах localhost.

А вот код команды (которая по задумке в будущем будет исполняться по cron'у):
PHP:
скопировать код в буфер обмена
  1. class RabbitCommand extends CConsoleCommand
  2. {
  3.     public function run($args)
  4.     {
  5.         $this->checkProductData();
  6.     }
  7.  
  8.     public function checkProductData()
  9.     {
  10.         $rabbit = new RabbitReceiver();
  11.         if ($message = $rabbit->receive('receive_product_data', 'amq.product', 'send_product_data')) {
  12.             $data = unserialize($message);
  13.  
  14.             $product = new Product();
  15.             $product->attributes = $data['data'];
  16.  
  17.             if ($product->save()) {
  18.                 return 0;
  19.             }
  20.         }
  21.     }
  22. }

И вот такой компонент для принятия сообщения:
PHP:
скопировать код в буфер обмена
  1. class RabbitReceiver
  2. {
  3.     public $connection;
  4.  
  5.     function __construct()
  6.     {
  7.         $this->connection = new AMQPConnection(Yii::app()->params['amqp_connection']);
  8.         $this->connection->connect();
  9.     }
  10.  
  11.     public function receive($queue_name, $exchange_name, $routing_key)
  12.     {
  13.         $result = false;
  14.  
  15.         $channel = new AMQPChannel($this->connection);
  16.  
  17.         $queue = new AMQPQueue($channel);
  18.         $queue->setName($queue_name);
  19.         $queue->declare();
  20.         $queue->bind($exchange_name, $routing_key);
  21.  
  22.         $envelope = $queue->get();
  23.         if ($envelope && $queue->ack($envelope->getDeliveryTag())) {
  24.             $result = $envelope;
  25.         }
  26.  
  27.         $this->connection->disconnect();
  28.  
  29.         return $result;
  30.     }
  31. }

По факту exchange_name и routing_key в обоих сайтах указал одинаковые, однако вот как описал выше - "плюется" вот то самое исключение. В чем может быть причина/проблема?

Буду всем очень признателен за любую помощь и советы. Заранее спасибо!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB