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

In vielen Fällen muss der benutzerdefinierte Knoten auf den Inhalt der Nachricht zugreifen, die an seinem Eingabeterminal empfangen wurde. 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 ändern Sie den Wert eines Zielelements:
      cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8); 
  3. 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.

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);
          }
        }
  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));
  ...                                                               
}
Eine Nachricht kann nur einmal 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, 2005 Letzte Aktualisierung: Nov 17, 2005
as24989_