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 Datenbanktabellen 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;
  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.

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.

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 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.

Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2005 Letzte Aktualisierung: Nov 17, 2005
as24988_