Nette: Kdyby/RabbitMq

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:

Zdroje

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *