Funktionalität eines C-Nachrichtenverarbeitungsknotens oder C-Output-Knotens erweitern

Wenn Sie einen benutzerdefinierten Nachrichtenverarbeitungs- oder Output-Knoten in der Programmiersprache C erstellt haben, können Sie dessen Funktionen erweitern.

Vorbereitungen:

Lesen Sie den Abschnitt Nachrichtenverarbeitungs- oder Sendeknoten in C erstellen.

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 mithilfe 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. Die neuen Elemente befinden sich normalerweise in der Domäne des 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 mithilfe 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 müssen Sie eine der folgenden Funktionen verwenden, mit denen ein Parser einem Nachrichtenbaumstrukturordner zugeordnet wird:
cniCreateElementAsFirstChildUsingParser
cniCreateElementAsLastChildUsingParser
cniCreateElementAfterUsingParser
cniCreateElementBeforeUsingParser
Beim Erstellen eines Nachrichtenhauptteils dürfen folgende Funktionen nicht verwendet werden, weil sie dem Ordner keinen Parser als Eigner zuordnen:
cniCreateElementAsFirstChild
cniCreateElementAsLastChild
cniCreateElementAfter
cniCreateElementBefore

Auf ESQL zugreifen

Knoten können ESQL-Ausdrücke mit der ESQL-Syntax des Comput-Knotens aufrufen. Sie können die Komponenten der Nachricht unter Verwendung von ESQL-Ausdrücken erstellen und ändern, und Sie können mithilfe 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.XMLNS.Result[] = (SELECT T.C1 AS Col1 FROM Database.TABLE AS T;");
  ...
  cniSqlSelect(&rc, sqlExpr, localEnvironment, exceptionList, message, outMsg);
  cniSqlDeleteStatement(&rc, sqlExpr);
  ...                                                               
}

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

Wenn Ihr benutzerdefinierter Comput-Knoten hauptsächlich mit ESQL arbeitet, verwenden Sie einen Compute-Knoten.

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 mithilfe 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, localEnvironment, exceptionList, outMsg);
          }
        }

    Im obigen Beispiel wird mithilfe 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 mithilfe der Funktion cniDeleteMessage löschen:
     cniDeleteMessage(&rc, outMsg);

Daten in eine Ausgabeeinheit schreiben

Eine umgewandelte Nachricht muss in einem Bitstrom serialisiert werden; eine Nachricht kann nur einmal serialisiert werden.

Daraufhin kann auf den Bitstrom zugegriffen werden, und er kann in eine Ausgabeeinheit geschrieben werden. Schreiben Sie die Nachricht mithilfe 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.

Erstellen Sie keinen benutzerdefinierten Output-Knoten, um Nachrichten in WebSphere MQ-Warteschlangen zu schreiben; verwenden Sie in diesem Szenario stattdessen den mitgelieferten MQOutput-Knoten. Der Broker verwaltet 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 Output-Knoten beeinträchtigt.

Zugehörige Verweise
Benutzerdefinierte C-Knoten-API
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Feedback

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Letzte Aktualisierung : 2009-02-17 15:30:03

as24989_