Signatur
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
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);
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);
// 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.