Vorbereitungen:
Ein Empfangsknoten kann Daten aus allen Arten von externen Quellen, z. B. einem Dateisystem oder FTP-Verbindungen, empfangen, solange die Ausgabe des Knotens im richtigen Format vorliegt. Für Verbindungen zu Warteschlangen oder Datenbanken sollten Sie die IBM MQSI-Knoten und die bereitgestellten API-Aufrufe verwenden, da die MQSI-Knoten bereits für die Fehlerbehandlung konfiguriert sind. Verwenden Sie für den Direktzugriff auf WebSphere MQ-Warteschlangen nicht die Befehle mqget oder mqput.
{ static char* functionName = (char *)"_Input_run()"; void* buffer; CciTerminal* terminalObject; int buflen = 4096; int rc = CCI_SUCCESS; int rcDispatch = CCI_SUCCESS; buffer = readFromDevice(&buflen); cniSetInputBuffer(&rc, message, buffer, buflen); } /*propagate etc*/
Ein Empfangsknoten ist für die entsprechende Endverarbeitung einer Nachricht verantwortlich, wenn die Nachricht über einen Nachrichtenfluss weitergegeben wurde. Der Empfangsknoten muss insbesondere dafür sorgen, dass Transaktionen festgeschrieben oder zurückgesetzt werden und Threads an den Thread-Pool zurückgegeben werden.
Jeder Nachrichtenfluss-Thread wird aus einem Thread-Pool zugeordnet, der für jeden Nachrichtenfluss verwaltet wird, und startet die Ausführung in der Funktion cniRun. Sie bestimmen das Verhalten eines Threads mit der Dienstprogrammfunktion cniDispatchThread und dem entsprechenden Rückgabewert.
Über die Funktion cniRun können Sie die Dienstprogrammfunktion cniDispatchThread aufrufen, damit ein anderer Thread mit der Ausführung der Funktion cniRun beginnt. Der beste Zeitpunkt für die Ausführung eines weiteren Threads ist unmittelbar nach der Feststellung, dass Daten verfügbar sein könnten, die von der Funktion im neuen Thread verarbeitet werden können.
Der Ausdruck Transaktion wird hier generisch verwendet, um entweder eine global koordinierte Transaktion oder eine vom Broker gesteuerte Transaktion zu beschreiben. Global koordinierte Transaktionen werden entweder von WebSphere MQ als XA-kompatiblem Transaktionsmanager oder Resource Recovery Service (RRS) unter z/OS koordiniert. WebSphere Message Broker steuert die Transaktionen durch das Festschreiben (oder Zurücksetzen) von Datenbankressourcen und anschließendem Festschreiben von WebSphere MQ-Arbeitseinheiten. Bei der Verwendung eines benutzerdefinierten Knotens können aktualisierte Ressourcen jedoch nicht automatisch vom Broker festgeschrieben werden. Der benutzerdefinierte Knoten verwendet Rückgabewerte, um anzugeben, ob eine Transaktion erfolgreich war, und um zu steuern, ob Transaktionen festgeschrieben oder zurückgesetzt werden. Alle nicht verarbeiteten Ausnahmebedingungen werden von der Broker-Infrastruktur abgefangen, und die Transaktion wird zurückgesetzt.
In der folgenden Tabelle werden die einzelnen unterstützten Rückgabewerte, deren Auswirkungen auf Transaktionen und die Aktion des Brokers für den aktuellen Thread beschrieben.
Rückgabewert | Auswirkung für Transaktion | Brokeraktion für den Thread |
---|---|---|
CCI_SUCCESS_CONTINUE | festgeschrieben | Ruft denselben Thread erneut in der Funktion cniRun auf. |
CCI_SUCCESS_RETURN | festgeschrieben | Gibt den Thread an den Thread-Pool zurück. |
CCI_FAILURE_CONTINUE | zurückgesetzt | Ruft denselben Thread erneut in der Funktion cniRun auf. |
CCI_FAILURE_RETURN | zurückgesetzt | Gibt den Thread an den Thread-Pool zurück. |
CCI_TIMEOUT | Nicht zutreffend. Bei der Funktion findet in regelmäßigen Abständen eine Zeitlimitüberschreitung statt, während Sie auf eine Eingabenachricht wartet. | Ruft denselben Thread erneut in der Funktion cniRun auf. |
{ ... cniDispatchThread(&rcDispatch, ((NODE_CONTEXT_ST *)context)->nodeObject); ... if (rcDispatch == CCI_NO_THREADS_AVAILABLE) return CCI_SUCCESS_CONTINUE; else return CCI_SUCCESS_RETURN; }
Bevor Sie eine Nachricht weitergeben, müssen Sie entscheiden, welche Nachrichtenflussdaten Sie weitergeben möchten und welches Terminal die Daten empfangen soll.
Das Terminalobjekt (terminalObject) stammt aus einer Liste, die der benutzerdefinierte Knoten selbst verwaltet.
if (terminalObject) { if (cniIsTerminalAttached(&rc, terminalObject)) { if (rc == CCI_SUCCESS) { cniPropagate(&rc, terminalObject, destinationList, exceptionList, message); } }
Im obigen Beispiel wird mit Hilfe der Funktion cniIsTerminalAttached getestet, ob die Nachricht an das angegebene Terminal weitergegeben werden kann. Wenn Sie die Funktion cniIsTerminalAttached nicht verwenden und das Terminal nicht durch einen Konnektor mit einem anderen Knoten verbunden ist, wird die Nachricht nicht weitergegeben. Es wird auch keine Warnung zurückgegeben. Verwenden Sie die Funktion cniIsTerminalAttached, um dieses Problem zu vermeiden.