File d'attente Stomp
Stomp est un protocole simple de messagerie orienté texte (streaming) qui fournit un format de connexion interopérable, permettant aux clients STOMP d'interagir avec n'importe quel courtier de messages STOMP. workerman/stomp implémente un client Stomp, principalement utilisé dans des scénarios de files d'attente de messages tels que RabbitMQ, Apollo, ActiveMQ, etc.
Installation
composer require webman/stomp
Configuration
Le fichier de configuration se trouve dans config/plugin/webman/stomp
Envoi de messages
<?php
namespace app\controller;
use support\Request;
use Webman\Stomp\Client;
class Index
{
public function queue(Request $request)
{
// File d'attente
$queue = 'examples';
// Données (lors de la transmission d'un tableau, une sérialisation manuelle est requise, par ex. avec json_encode, serialize, etc.)
$data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
// Effectuer l'envoi
Client::send($queue, $data);
return response('redis queue test');
}
}
Pour des raisons de compatibilité avec d'autres projets, le composant Stomp ne fournit pas de sérialisation ni de désérialisation automatiques. Si les données envoyées sont un tableau, il faut les sérialiser manuellement et les désérialiser lors de la consommation.
Consommation de messages
Créez le fichier app/queue/stomp/MyMailSend.php (le nom de la classe est libre, tant qu'il respecte la norme PSR-4).
<?php
namespace app\queue\stomp;
use Workerman\Stomp\AckResolver;
use Webman\Stomp\Consumer;
class MyMailSend implements Consumer
{
// Nom de la file d'attente
public $queue = 'examples';
// Nom de la connexion, correspondant à la connexion dans stomp.php
public $connection = 'default';
// Si la valeur est 'client', il faut appeler $ack_resolver->ack() pour indiquer au serveur que la consommation a réussi
// Si la valeur est 'auto', il n'est pas nécessaire d'appeler $ack_resolver->ack()
public $ack = 'auto';
// Consommer
public function consume($data, AckResolver $ack_resolver = null)
{
// Si les données sont un tableau, il faut les désérialiser manuellement
var_export(json_decode($data, true)); // affiche ['to' => 'tom@gmail.com', 'content' => 'hello']
// Indiquer au serveur que la consommation a réussi
$ack_resolver->ack(); // cet appel peut être omis lorsque ack est 'auto'
}
}
Activer le protocole Stomp dans RabbitMQ
Par défaut, RabbitMQ n'active pas le protocole Stomp. Il faut exécuter la commande suivante pour l'activer :
rabbitmq-plugins enable rabbitmq_stomp
Une fois activé, le port par défaut pour Stomp est 61613.