Funktionalität eines C-Nachrichtenverarbeitungsknotens oder C-Sendeknotens 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. Auf Nachrichtendaten zugreifen
  2. Nachrichtenobjekt umwandeln
  3. Auf ESQL zugreifen
  4. Nachricht weitergeben
  5. Daten in eine Ausgabeeinheit schreiben

Auf Nachrichtendaten zugreifen

Die benutzerdefinierten Knoten müssen häufig auf die Inhalte der Nachrichten zugreifen, die im Eingabeterminal empfangen wurden. Die Nachricht wird als Baumstruktur aus Syntaxelementen dargestellt. Gruppen von Dienstprogrammfunktionen werden für das Nachrichtenmanagement, den Zugriff auf Nachrichtenpuffer, die Navigation durch Syntaxelemente und den Zugriff auf Syntaxelemente bereitgestellt. (Weitere Informationen zu den Dienstprogrammfunktion finden Sie unter Dienstprogrammfunktionen für C-Knoten.)

Sie möchten möglicherweise folgende Arten von Abfragen ausführen:
  • Das Stammelement des erforderlichen Nachrichtenobjekts abrufen
  • Zugriff auf die Bitstromdarstellung einer Elementbaumstruktur
  • Durch die Baumstruktur navigieren oder diese abfragen, indem Sie untergeordnete oder gleichgeordnete Elemente nach Namen abfragen
  • Den Typ des Element abrufen
  • Den Wert des Element abrufen

So fragen Sie beispielsweise den Namen und den Typ des ersten untergeordneten Elements des Hauptteils ab:

void cniEvaluate( ...               
){                                    
  ...
/* Navigate to the target element */ 
  rootElement = cniRootElement(&rc, message);
  bodyElement = cniLastChild(&rc, rootElement);
  bodyFirstChild = cniFirstChild(&rc, bodyElement);

/* Query the name and value of the target element */
  cniElementName(&rc, bodyFirstChild, (CciChar*)&elementname, sizeof(elementName)); 
  bytes = cniElementCharacterValue(
		&rc, bodyfirstChild, (CciChar*)&eValue, sizeof(eValue));
  ...    
}

Mit der Funktion 'cniElementAsBitstream' können Sie auf die Bitstromdarstellung einer Elementbaumstruktur zugreifen. Sie können damit die Bitstromdarstellung jedes Elements in einer Nachricht abrufen. Informationen zur Verwendung dieser Funktion und des Mustercodes finden Sie untercniElementAsBitstream.

Nachrichtenobjekt umwandeln

Die empfangene Eingabenachricht ist schreibgeschützt, deshalb müssen Sie sie mit Hilfe der Funktion cniCreateMessage in eine neue Ausgabenachricht schreiben, bevor sie umgewandelt werden kann. Sie können Elemente aus der Eingabenachricht kopieren, oder Sie können neue Elemente erstellen und diese an die Nachricht anhängen. Neue Elemente befinden sich im Allgemeinen in der Domäne eines Parsers.

Beispiel:
  1. So schreiben Sie die ankommende Nachricht in eine neue Nachricht:
    {
      ...
      context = cniGetMessageContext(&rc, message)); 
      outMsg = cniCreateMessage(&rc, context)); 
      ...
    }
  2. So erstellen Sie eine Kopie der neuen Nachricht:
    cniCopyElementTree(&rc, sourceElement, targetElement);
  3. So ändern Sie den Wert eines Zielelements:
      cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8); 
  4. Nach dem Abschluss und der Weitergabe der Nachricht müssen Sie die Ausgabenachricht mit Hilfe der Funktion cniDeleteMessage löschen:
     cniDeleteMessage(&rc, outMsg);
Als Teil der Umsetzung kann es erforderlich sein, einen neuen Nachrichtenhauptteil zu erstellen. Zum Erstellen eines neuen Nachrichtenhauptteils sind folgende Funktionen verfügbar:
cniCreateElementAsFirstChildUsingParsercniCreateElementAsLastChildUsingParsercniCreateElementAfterUsingParsercniCreateElementBeforeUsingParser
Diese Funktionen sollten verwendet werden, weil sie speziell für das Zuweisen eines Parsers zu einer Nachrichtenbaumstruktur vorgesehen sind.
Beim Erstellen eines Nachrichtenhauptteils dürfen folgende Funktionen nicht verwendet werden, weil sie dem Ordner keinen Parser als Eigner zuordnen:
cniCreateElementAsFirstChildcniCreateElementAsLastChildcniCreateElementAftercniCreateElementBefore

Auf ESQL zugreifen

Knoten können ESQL-Ausdrücke mit der ESQL-Syntax des Rechenknotens aufrufen. Sie können die Komponenten der Nachricht unter Verwendung von ESQL-Ausdrücken erstellen und ändern, und Sie können mit Hilfe der Funktionen cniSqlCreateStatement, cniSqlSelect, cniSqlDeleteStatement und cniSqlExecute auf Elemente der Eingabenachricht und Daten aus einer externen Datenbank verweisen.

So füllen Sie beispielsweise das Element 'Result' (Ergebnis) mit dem Inhalt einer Spalte in einer Datenbanktabelle:

{
  ...
  sqlExpr = cniSqlCreateStatement(&rc, 
   (NODE_CONTEXT_ST *)context->nodeObject,
   L"DB", CCI_SQL_TRANSACTION_AUTO,
   L"SET OutputRoot.XML.Result[] = (SELECT T.C1 AS Col1 FROM Database.TABLE AS T;");
  ...
  cniSqlSelect(&rc, sqlExpr, destinationList, exceptionList, message, outMsg);
  cniSqlDeleteStatement(&rc, sqlExpr);
  ...                                                               
}

Weitere Informationen zu ESQL finden Sie unter Übersicht zu ESQL.

Wenn Ihr benutzerdefinierter Rechenknoten hauptsächlich mit ESQL arbeitet, verwenden Sie einen Rechenknoten. Weitere Informationen dazu finden Sie unter Rechenknoten (Compute).

Nachricht weitergeben

Bevor Sie eine Nachricht weitergeben, müssen Sie entscheiden, welche Nachrichtenflussdaten Sie weitergeben möchten und welches Terminal die Daten empfangen soll.
  1. Wenn die Nachricht geändert wurde, sollten Sie sie mit Hilfe der Funktion cniFinalize abschließen, bevor Sie sie weitergeben. Beispiel:
          cniFinalize(&rc, outMsg, CCI_FINALIZE_NONE);
  2. Das Terminalobjekt (terminalObject) stammt aus einer Liste, die der benutzerdefinierte Knoten selbst verwaltet. Um die Nachricht an das Ausgabeterminal weiterzugeben, verwenden Sie die Funktion cniPropagate:
      if (terminalObject) {
        if (cniIsTerminalAttached(&rc, terminalObject)) {
          if (rc == CCI_SUCCESS) {
            cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg);
          }
        }

    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.

  3. Wenn Sie mit cniCreateMessage eine neue Ausgabenachricht erstellt haben, müssen Sie nach der Weitergabe der Nachricht die Ausgabenachricht mit Hilfe der Funktion cniDeleteMessage löschen:
     cniDeleteMessage(&rc, outMsg);

Daten in eine Ausgabeeinheit schreiben

Eine umgewandelte Nachricht muss in einen Bitstrom serialisiert werden. Daraufhin kann auf den Bitstrom zugegriffen werden, und er kann in eine Ausgabeeinheit geschrieben werden. Sie schreiben die Nachricht mit Hilfe der Funktion cniWriteBuffer in einen Bitstrom. Beispiel:
{
  ...
  cniWriteBuffer(&rc, message);
  writeToDevice(cniBufferPointer(&rc, message), cniBufferSize(&rc, message));
  ...                                                               
}
In diesem Beispiel handelt es sich bei der Methode writeToDevice um eine benutzerdefinierte Methode, die einen Bitstrom in eine Ausgabeeinheit schreibt.

Eine Nachricht kann nur ein Mal serialisiert werden.

Anmerkung: Sie müssen den bereitgestellten MQSendeknoten verwenden, wenn Sie Daten inWebSphere MQ-Warteschlangen schreiben, da der Broker intern eine WebSphere MQ-Verbindung und offene Warteschlangenkennungen threadweise verwaltet und diese zwischengespeichert werden, um die Leistung zu optimieren. Außerdem verarbeitet der Broker Fehlerbehebungsszenarios, wenn bestimmte WebSphere MQ-Ereignisse auftreten, und dies würde durch die Verwendung von WebSphere MQ MQI-Aufrufen in einem benutzerdefinierten Sendeknoten beeinträchtigt.
Zugehörige Verweise
Benutzerdefinierte C-Knoten-API
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2006 Letzte Aktualisierung: 23. Aug. 2006
as24989_