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 Datenbanktabellen 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; char xmlData[] = "<A>data</A>"; buffer = malloc(buflen); memcpy(buffer, &xmlData, sizeof(xmlData)); cniSetInputBuffer(&rc, message, buffer, buflen); } /*propagate etc*/ free(buffer);Im obigen Beispiel wird veranschaulicht, wie ein Speicherbereich reserviert wird (buffer = malloc(buflen);). Wenn Sie in C programmieren, müssen Sie den reservierten Speicher wieder freigeben, wenn Sie ihn nicht mehr benötigen. Der Broker versucht möglicherweise, auf diesen Speicher zuzugreifen, während die Nachricht im Nachrichtenfluss weitergegeben wird, deshalb sollten Sie den Speicher erst nach dem Aufruf von cniPropagate für dieselbe Nachricht (CciMessage) freigeben.
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.
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 mit einem anderen Knoten verbunden ist, wird die Nachricht nicht weitergegeben. Wenn Sie diese Funktion verwenden, können Sie das Verhalten des Knotens ändern, wenn keine Verbindung zu einem Terminal besteht.