Stomp-Warteschlange
Stomp ist ein einfaches (Stream-)Textnachrichtenprotokoll, das ein interoperables Verbindungsformat bietet, das es STOMP-Clients ermöglicht, mit beliebigen STOMP-Nachrichtenbrokern (Broker) zu interagieren. workerman/stomp implementiert einen Stomp-Client, der hauptsächlich für Szenarien mit Nachrichtenwarteschlangen wie RabbitMQ, Apollo, ActiveMQ usw. verwendet wird.
Installation
composer require webman/stomp
Konfiguration
Die Konfigurationsdatei befindet sich unter config/plugin/webman/stomp
Nachricht senden
<?php
namespace app\controller;
use support\Request;
use Webman\Stomp\Client;
class Index
{
public function queue(Request $request)
{
// Warteschlange
$queue = 'examples';
// Daten (beim Übertragen von Arrays muss eine eigene Serialisierung vorgenommen werden, z.B. mit json_encode, serialize usw.)
$data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
// Nachricht senden
Client::send($queue, $data);
return response('redis queue test');
}
}
Um die Kompatibilität mit anderen Projekten zu gewährleisten, bietet die Stomp-Komponente keine automatische Serialisierungs- oder Deserialisierungsfunktion. Wenn Array-Daten gesendet werden, muss die Serialisierung selbst durchgeführt werden, und beim Konsumieren muss die Deserialisierung selbst erfolgen.
Nachrichten konsumieren
Erstellen Sie app/queue/stomp/MyMailSend.php
(der Klassenname ist beliebig, solange er den PSR-4-Standards entspricht).
<?php
namespace app\queue\stomp;
use Workerman\Stomp\AckResolver;
use Webman\Stomp\Consumer;
class MyMailSend implements Consumer
{
// Warteschlangenname
public $queue = 'examples';
// Verbindungsname, entspricht der Verbindung in stomp.php
public $connection = 'default';
// Wenn der Wert 'client' ist, muss $ack_resolver->ack() aufgerufen werden, um dem Server mitzuteilen, dass der Konsum erfolgreich war
// Wenn der Wert 'auto' ist, ist kein Aufruf von $ack_resolver->ack() erforderlich
public $ack = 'auto';
// Konsumieren
public function consume($data, AckResolver $ack_resolver = null)
{
// Wenn die Daten ein Array sind, muss eine eigene Deserialisierung vorgenommen werden
var_export(json_decode($data, true)); // Ausgabe ['to' => 'tom@gmail.com', 'content' => 'hello']
// Dem Server mitteilen, dass der Konsum erfolgreich war
$ack_resolver->ack(); // Bei ack='auto' kann dieser Aufruf weggelassen werden
}
}
RabbitMQ STOMP-Protokoll aktivieren
RabbitMQ hat standardmäßig das STOMP-Protokoll nicht aktiviert. Führen Sie den folgenden Befehl aus, um es zu aktivieren:
rabbitmq-plugins enable rabbitmq_stomp
Nach der Aktivierung ist der Standardport für STOMP 61613.