Start · Sprachen · PHP · Referenz · stomp_commit

stomp_commit

Funktion

Bestätigt (commit) eine laufende Transaktion auf einer STOMP-Verbindung und schließt sie damit ab.

seit PHP 0.1.0 Kategorie: misc

Signatur

stomp_commit(resource $link, string $transaction_id, array $headers = []): bool

Beschreibung

stomp_commit() ist die prozedurale Variante der STOMP-Erweiterung und bestätigt eine zuvor mit stomp_begin() gestartete Transaktion. Nach dem Commit gelten alle innerhalb der Transaktion gesendeten oder bestätigten Nachrichten als dauerhaft übermittelt bzw. verarbeitet.

STOMP (Simple Text Oriented Messaging Protocol) ist ein Nachrichtenprotokoll, das u. a. von ActiveMQ, RabbitMQ und anderen Message-Brokern unterstützt wird. Transaktionen ermöglichen dabei die atomare Verarbeitung mehrerer Nachrichten: Entweder alle Operationen werden bestätigt oder keine (rollback mit stomp_abort()).

Die Funktion wird typischerweise am Ende eines Verarbeitungsblocks aufgerufen, wenn alle Nachrichten innerhalb der Transaktion erfolgreich bearbeitet wurden. Der Parameter $transaction_id muss exakt der ID entsprechen, die beim Aufruf von stomp_begin() verwendet wurde.

Optionale $headers ermöglichen es, broker-spezifische Metainformationen mitzugeben. Nach einem erfolgreichen Commit ist die Transaktion abgeschlossen und kann nicht mehr rückgängig gemacht werden.

Parameter

Name Typ Default Beschreibung
$link Pflicht resource Eine gültige STOMP-Verbindungsressource, wie sie von stomp_connect() zurückgegeben wird.
$transaction_id Pflicht string Die eindeutige Bezeichnung der Transaktion, die bestätigt werden soll. Muss mit der ID übereinstimmen, die bei stomp_begin() verwendet wurde.
$headers array [] Optionales assoziatives Array mit zusätzlichen Headern, die mit dem COMMIT-Frame an den Broker gesendet werden. Broker-spezifisch und in den meisten Fällen nicht erforderlich.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Transaktion erfolgreich bestätigt wurde. Im Fehlerfall wird false zurückgegeben; mit stomp_error() kann die genaue Fehlermeldung abgerufen werden.

Beispiele

Einfacher Transaktions-Commit beim Nachrichtenversand

<?php
// Verbindung zum STOMP-Broker herstellen
$link = stomp_connect('tcp://localhost:61613');

if (!$link) {
    die('Verbindung fehlgeschlagen: ' . stomp_connect_error());
}

$transactionId = 'tx-' . uniqid();

// Transaktion starten
stomp_begin($link, $transactionId);

try {
    // Nachrichten innerhalb der Transaktion senden
    stomp_send($link, '/queue/bestellungen', 'Bestellung #1001', [
        'transaction' => $transactionId
    ]);
    stomp_send($link, '/queue/bestellungen', 'Bestellung #1002', [
        'transaction' => $transactionId
    ]);

    // Transaktion bestätigen
    if (stomp_commit($link, $transactionId)) {
        echo "Transaktion '{$transactionId}' erfolgreich committed.\n";
    } else {
        echo 'Commit fehlgeschlagen: ' . stomp_error($link) . "\n";
        stomp_abort($link, $transactionId);
    }
} catch (Exception $e) {
    // Bei Fehler: Transaktion zurückrollen
    stomp_abort($link, $transactionId);
    echo 'Fehler: ' . $e->getMessage() . "\n";
}

stomp_close($link);
Transaktion 'tx-64a1f3c2e5b7a' erfolgreich committed.

Transaktionsbasiertes Konsumieren von Nachrichten

<?php
$link = stomp_connect('tcp://localhost:61613');

if (!$link) {
    die('Verbindung fehlgeschlagen.');
}

// Queue abonnieren
stomp_subscribe($link, '/queue/aufgaben', ['ack' => 'client']);

$transactionId = 'consume-tx-' . uniqid();
stomp_begin($link, $transactionId);

// Nachricht lesen
if (stomp_has_frame($link)) {
    $frame = stomp_read_frame($link);

    if ($frame !== false) {
        echo 'Verarbeite Nachricht: ' . $frame['body'] . "\n";

        // Nachricht innerhalb der Transaktion bestätigen
        stomp_ack($link, $frame['headers']['message-id'], [
            'transaction' => $transactionId
        ]);

        // Transaktion abschließen
        stomp_commit($link, $transactionId);
        echo "Nachricht erfolgreich bestätigt und Transaktion committed.\n";
    }
}

stomp_close($link);
Verarbeite Nachricht: Aufgabe #42 Nachricht erfolgreich bestätigt und Transaktion committed.

// Wichtig · Fallstricke

Erweiterung erforderlich: Die stomp_*-Funktionen stehen nur zur Verfügung, wenn die PECL-Erweiterung stomp installiert ist (pecl install stomp). Ab PHP 7.x ist die Verfügbarkeit eingeschränkt; die Erweiterung wird nicht mehr aktiv weiterentwickelt.

Transaktions-ID: Es ist wichtig, dass die $transaction_id beim Senden von Nachrichten oder beim Bestätigen (stomp_ack()) als Header transaction angegeben wird – andernfalls gehören diese Operationen nicht zur Transaktion, auch wenn diese geöffnet ist.

Fehlerbehandlung: Nach einem fehlgeschlagenen Commit sollte stets stomp_abort() aufgerufen werden, um die Transaktion sauber zurückzurollen und Ressourcen auf dem Broker freizugeben.

OOP-Alternative: Die objektorientierte Variante dieser Funktion ist die Methode Stomp::commit(), die in moderneren Codebasen bevorzugt werden sollte.