Start · Sprachen · PHP · Referenz · mqseries_get

mqseries_get

Funktion

Empfängt eine Nachricht aus einer IBM MQ-Queue mittels des MQGET-Aufrufs.

Kategorie: misc

Signatur

mqseries_get(resource $hConn, resource $hObj, array &$md, array &$gmo, int &$bufferLength, string &$msg, int &$dataLength, resource &$compCode, resource &$reason): void

Beschreibung

mqseries_get liest eine Nachricht aus einer zuvor geöffneten IBM MQ-Queue. Die Funktion entspricht dem nativen MQGET-Aufruf der IBM MQ (früher WebSphere MQ) C-Bibliothek und wird über die PECL-Erweiterung mqseries bereitgestellt.

Vor dem Aufruf muss eine Verbindung zum Queue-Manager mit mqseries_conn oder mqseries_connx sowie eine geöffnete Queue mit mqseries_open (mit Leseberechtigung) vorliegen. Die Nachrichtenstruktur (Message Descriptor, $md) und die Get-Message-Optionen ($gmo) werden als assoziative Arrays übergeben und können nach dem Aufruf aktualisierte Werte enthalten.

Nach dem Aufruf sollten $compCode und $reason geprüft werden. Ein Completion Code von MQCC_OK (0) signalisiert Erfolg, MQCC_WARNING (1) eine Warnung, MQCC_FAILED (2) einen Fehler. Der Reason Code gibt nähere Auskunft – z. B. MQRC_NO_MSG_AVAILABLE (2033), wenn keine Nachricht in der Queue vorhanden ist.

Die Funktion ist besonders geeignet für Unternehmensanwendungen, die mit IBM MQ-Middleware kommunizieren müssen, etwa für asynchrone Nachrichtenverarbeitung, Workflow-Integration oder zuverlässige Punkt-zu-Punkt-Kommunikation.

Parameter

Name Typ Default Beschreibung
$hConn Pflicht resource Verbindungs-Handle zum Queue-Manager, das von mqseries_conn oder mqseries_connx zurückgegeben wurde.
$hObj Pflicht resource Objekt-Handle der geöffneten Queue, das von mqseries_open mit Lesezugriff (MQOO_INPUT_AS_Q_DEF o. ä.) zurückgegeben wurde.
$md Pflicht array Referenz auf ein assoziatives Array, das den Message Descriptor (MQMD) beschreibt. Enthält nach dem Aufruf die Metadaten der empfangenen Nachricht, z. B. MsgId, CorrelId, Format.
$gmo Pflicht array Referenz auf ein assoziatives Array mit den Get-Message-Optionen (MQGMO), z. B. Options (MQGMO_WAIT, MQGMO_NO_WAIT), WaitInterval (Wartezeit in Millisekunden).
$bufferLength Pflicht int Referenz auf die maximale Größe des Empfangspuffers in Bytes. Ist die Nachricht größer als dieser Wert, schlägt der Aufruf mit MQRC_TRUNCATED_MSG_FAILED fehl.
$msg Pflicht string Referenz auf den String, in den der Nachrichteninhalt nach erfolgreichem Aufruf geschrieben wird.
$dataLength Pflicht int Referenz auf einen Integer, der nach dem Aufruf die tatsächliche Länge der empfangenen Nachrichtendaten in Bytes enthält.
$compCode Pflicht resource Referenz auf den Completion Code. Nach dem Aufruf enthält die Variable den Statuscode: MQCC_OK (0), MQCC_WARNING (1) oder MQCC_FAILED (2).
$reason Pflicht resource Referenz auf den Reason Code, der im Fehlerfall eine genauere Fehlerursache liefert, z. B. MQRC_NO_MSG_AVAILABLE (2033) wenn keine Nachricht verfügbar ist.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück. Erfolg oder Fehler werden über $compCode und $reason signalisiert.

Beispiele

Einfaches Lesen einer Nachricht aus einer MQ-Queue

<?php
// Verbindung zum Queue-Manager herstellen
mqseries_conn('QM_TEST', $hConn, $compCode, $reason);

if ($compCode !== MQCC_OK) {
    echo "Verbindungsfehler. Reason: $reason\n";
    exit;
}

// Queue öffnen (Lesezugriff)
$od = [
    'ObjectName'  => 'TEST.QUEUE',
    'ObjectType'  => MQOT_Q,
];
mqseries_open($hConn, $od, MQOO_INPUT_AS_Q_DEF | MQOO_FAIL_IF_QUIESCING, $hObj, $compCode, $reason);

if ($compCode !== MQCC_OK) {
    echo "Queue-Open-Fehler. Reason: $reason\n";
    mqseries_disc($hConn, $compCode, $reason);
    exit;
}

// Nachricht empfangen
$md  = ['Version' => MQMD_VERSION_1];
$gmo = ['Options' => MQGMO_NO_WAIT, 'Version' => MQGMO_VERSION_2];
$bufferLength = 10240;
$msg = '';
$dataLength = 0;

mqseries_get($hConn, $hObj, $md, $gmo, $bufferLength, $msg, $dataLength, $compCode, $reason);

if ($compCode === MQCC_OK) {
    echo "Empfangene Nachricht ($dataLength Bytes): " . $msg . "\n";
} elseif ($reason === MQRC_NO_MSG_AVAILABLE) {
    echo "Keine Nachricht in der Queue verfügbar.\n";
} else {
    echo "Fehler beim Empfangen. CompCode: $compCode, Reason: $reason\n";
}

// Queue schließen und Verbindung trennen
mqseries_close($hConn, $hObj, MQCO_NONE, $compCode, $reason);
mqseries_disc($hConn, $compCode, $reason);
Empfangene Nachricht (13 Bytes): Hello MQ World

Nachricht mit Wartezeit (MQGMO_WAIT) empfangen

<?php
// Verbindung und Queue-Open wie im obigen Beispiel (hier ausgelassen) ...

// GMO mit Wartezeit von 5 Sekunden (5000 ms)
$md  = ['Version' => MQMD_VERSION_1];
$gmo = [
    'Options'      => MQGMO_WAIT,
    'WaitInterval' => 5000,
    'Version'      => MQGMO_VERSION_2,
];
$bufferLength = 65536;
$msg = '';
$dataLength = 0;

mqseries_get($hConn, $hObj, $md, $gmo, $bufferLength, $msg, $dataLength, $compCode, $reason);

if ($compCode === MQCC_OK) {
    echo "Nachricht erhalten: " . substr($msg, 0, $dataLength) . "\n";
    echo "Message-ID: " . bin2hex($md['MsgId']) . "\n";
} elseif ($reason === MQRC_NO_MSG_AVAILABLE) {
    echo "Timeout: Keine Nachricht innerhalb von 5 Sekunden eingegangen.\n";
} else {
    echo "Fehler: CompCode=$compCode, Reason=$reason\n";
}
Timeout: Keine Nachricht innerhalb von 5 Sekunden eingegangen.

// Wichtig · Fallstricke

Erweiterung erforderlich: mqseries_get ist Teil der PECL-Erweiterung mqseries, die separat installiert werden muss und eine installierte IBM MQ-Client-Bibliothek voraussetzt.

Puffergröße: Wenn $bufferLength kleiner als die tatsächliche Nachrichtengröße ist, schlägt der Aufruf mit Reason Code MQRC_TRUNCATED_MSG_FAILED (2079) fehl. Wähle den Puffer ausreichend groß oder reagiere auf diesen Reason Code mit einem erneuten Aufruf mit angepasster Puffergröße.

Transaktionssteuerung: Soll die Nachricht erst nach erfolgreicher Verarbeitung aus der Queue entfernt werden, nutze die Option MQGMO_SYNCPOINT in Kombination mit mqseries_back (Rollback) oder mqseries_cmit (Commit).

Kein direktes Fehler-Exception-Handling: Die Funktion wirft keine PHP-Exceptions. Prüfe immer $compCode und $reason nach jedem Aufruf.