Funktionalität eines C-Empfangsknotens erweitern

Vorbereitungen:

Stellen Sie sicher, dass Sie folgenden Abschnitt gelesen und verstanden haben:
Nach dem Erstellen eines benutzerdefinierten Knotens sind folgende Optionen verfügbar:
  1. Externe Daten in einem Puffer empfangen
  2. Threading und Transaktionen steuern
  3. Nachricht weitergeben

Externe Daten in einem Puffer empfangen

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.

Sie müssen einen Eingabepuffer (oder Bitstrom) bereitstellen, der Eingabedaten enthalten soll, und ihn einem Nachrichtenobjekt zuordnen. In der C-API wird der Puffer durch Verwendung der Dienstprogrammfunktion cniSetInputBuffer dem CciMessage-Objekt zugeordnet, das die Eingabenachricht darstellt. Beispiel:
{
  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*/

Threading und Transaktionen steuern

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.
Im Folgenden finden Sie ein Beispiel für die Verwendung des Rückkehrcodes SUCCESS_RETURN bei der Funktion cniDispatchThread:
{
  ...
  cniDispatchThread(&rcDispatch, ((NODE_CONTEXT_ST *)context)->nodeObject);  ...
  if (rcDispatch == CCI_NO_THREADS_AVAILABLE) return CCI_SUCCESS_CONTINUE;  
  else return CCI_SUCCESS_RETURN;
}     

Nachricht weitergeben

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.

Um die Nachricht z. B. an das Ausgabeterminal weiterzugeben, verwenden Sie die Funktion cniPropagate:
  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.

Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2006 Letzte Aktualisierung: 23. Aug. 2006
as24988_