21 lipca 2021

RabbitMq cz.2 – Publikacja wiadomości

Witam, w sobotni poranek, dziś znów trochę na temat RabbitMq.
W poprzednim wpisie, podzieliłem się informacjami w jaki sposób szybko można przy pomocy dockera, uruchomić rabbitMq oraz wysłać wiadomość przy pomocy panelu, do naszego skryptu.

W tym wpisie natomiast, nie będziemy już wysyłać wiadomości z panelu rabbitMq, a stworzymy sobie dwa skrypty, jeden z nich będzie publikował wiadomości, natomiast drugiemu przypadnie rola konsumenta.

W tym wpisie, nie będzie konieczne deklarowanie kolejki w panelu RabbitMq, ponieważ deklarujemy kolejki z poziomu skryptu przy pomocy metody „queue_declare„.

Odczyt wiadomości

Plik z konsumentem różni się od poprzedniego wpisu zaledwie jedną linią:

$channel->queue_declare('phpmessage', false, false, false, false);

Dodana linia kodu, tworzy kolejkę o nazwie „phpmessage„, tylko w przypadku gdy taka kolejka nie została wcześniej stworzona.

Zawartość pliku prezentuje się następująco:

<?php

require_once('vendor/autoload.php');

use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('rabbitmq', 5672, 'php', 'php');
$channel = $connection->channel();

$echoMessage = function ($msg) {
    echo ' [x] Received ', $msg->body, "\n";
};

$channel->queue_declare('phpmessage', false, false, false, false);

$channel->basic_consume('phpmessage', '', false, true, false, false, $echoMessage);

while ($channel->is_open()) {
    $channel->wait();
}

$channel->close();
$connection->close();

Wysyłka wiadomości

Skupmy się teraz na pliku o nazwie „post.php” który to będzie wysyłał wiadomości do kolejki „phpmessage„.

<?php

require_once('vendor/autoload.php');

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('rabbitmq', 5672, 'php', 'php');
$channel = $connection->channel();

$channel->queue_declare('phpmessage', false, false, false, false);

unset($argv[0]);

$msg = new AMQPMessage(implode(" ", $argv));
$channel->basic_publish($msg, '', 'phpmessage');

$channel->close();
$connection->close();

Zawartość jednego jak i drugiego pliku są bardzo podobne.

Plik „post.php” ładuje niezbędne biblioteki, następnie łączy się z „rabbitMq” oraz deklaruje kolejkę, gdyby ta nie została wcześniej stworzona.
Kolejne linie przygotowują odpowiednio wiadomość do wysłania, pobierają więc argumenty wywołania skryptu, usuwa przy tym pierwszy argument który zawsze będzie nazwą pliku, oraz przy pomocy metody „basic_publish” wysyła.

Wywołanie skryptu wysyłającego wiadomości odbywa się zgodnie z poniższym wzorem:

php post.php treść_wiadomości

Gdybyśmy nie usunęli inseksu [0] z tablicy $argv, nasza wysłana wiadomość wyglądała by tak: „post.php treść_wiadomości„. My usuwamy pierwszy człon, czyli nazwę pliku, następnie każdy element tablicy łączymy w jeden string przy pomocy funkcji „implode„, a poszczególne elementy tablicy rozdzielamy spacją (pierwszy argument wywołania „implode„).