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.