V Nette můžeme pro práci s RabbitMQ využít knihovnu od Kdyby/RabbitMq.
Instalace Kdyby/RabbitMq
composer:
$ composer require kdyby/rabbitmq
app/config.neon:
extensions: rabbitmq: Kdyby\RabbitMq\DI\RabbitMqExtension
Konfigurace
Vzhledem k rozsáhlým možnostem nastavení rabbita je vhodné jeho konfiguraci umístit do samostatného souboru. Vytvoříme nový soubor konfigurace app/config/config.rabbitmq.neon
a ten zavoláme v základním souboru s konfigurací:
app/config/config.neon:
includes: - config.rabbitmq.neon
Nastavení připojení
app/config/config.rabbitmq.neon:
rabbitmq: connection: default: host: host port: 5672 user: user password: password vhost: /
Producer
Producer je objekt, který do exchange zprávy posílá.
Konfigurace producera
Příklad registrace a nastavení producera:
rabbitmq: producers: mailNotification: connection: default exchange: {name: 'mail-service', type: direct} queue: {name: 'mail-service'} contentType: application/json
Získání a použití Producera v presenteru
V presenteru získáme objekt Producera zavoláním metody getProducer() nad objektem připojení \Kdyby\RabbitMq\Connection (který injectneme).
Pomocí Producera pak odesíláme zprávy:
class HomepagePresenter extends BasePresenter { /** * @var \Kdyby\RabbitMq\Connection * @inject */ public $amqpConnection; public function actionDefault() { // ziskani producera z pripojeni $producer = $this->amqpConnection->getProducer('mailNotification'); // odeslani zpravy $producer->publish('Toto je zprava'); } }
Získání a použití Producera v jiné třídě
Konkrétního producera můžeme v configu rovnou předat konkrétní třídě:
services: - App\MyNotifications(@rabbitmq.producer.mailNotification)
Producera pak v dané třídě použijeme podle potřeby:
<?php namespace App; class MyNotificator { /** * @var \Kdyby\RabbitMq\Producer */ private $producer; public function __construct(\Kdyby\RabbitMq\Producer $producer) { $this->producer = $producer; } public function notify($msg) { $this->producer->publish($msg); } }
Consumer
Consumer z exchange zprávy přijímá.
Je spuštěn v konzoli kde běží nepřetržitě a čeká na příjem zpráv.
V nette můžeme využít konzoli Symfony prostřednictvím knihovny Kdyby/Console.
Instalace Kdyby/Console
$ composer require kdyby/console
app/config.neon:
extensions: console: Kdyby\Console\DI\ConsoleExtension
Konfigurace Consumera
Konfigurace consumera do páru k předchozímu produceru:
consumers: mailNotification: connection: default exchange: {name: 'mail-service', type: direct} queue: {name: 'mail-service'} qos: {prefetchSize: 0, prefetchCount: 1, global: false} callback: @App\Consumers\RabbitMessageConsumer::process
Hodnota callback představuje metodu nějaké třídy, zaregistrované jako služba (díky čemuž pak lze injektnout další služby, jako např databázi, třídu s bysnys logikou, logger apod.):
services: - App\Consumers\RabbitMessageConsumer
(v tomto případě služba App\Consumers\RabbitMessageConsumer s metodou process), která každou přijatou zprávu zpracuje:
<?php namespace App\Consumers; class RabbitMessageConsumer implements \Kdyby\RabbitMq\IConsumer { public function __construct() { echo 'Cekam na zpravy...' . "\n"; } public function process(\PhpAmqpLib\Message\AMQPMessage $message) { echo 'Zprava prijata:' . "\n"; $data = json_decode($message->body); var_dump($data); echo 'Cekam na dalsi zpravu...' . "\n"; } }
Spuštění Consumera v konzoli
Consumera pak spustíme v konzoli:
$ php www/index.php rabbitmq:consumer mailNotification
Pro ladění lze příkaz spustit s parametrem –debug:
$ php www/index.php rabbitmq:consumer mailNotification --debug
Další parametry:
$ php www/index.php rabbitmq:consumer -m 50 mailNotification
- sdělujeme konzumerovi aby přijal pouze 50 zpráv a poté se ukončil
Tracy Kdyby/RabbitMq
Třešničnkou na dortu při využití knihovny Kdyby/RabbitMq je pak okno do lišty Tracy, které zobrazuje užitečné informace: