Wenn Sie einen benutzerdefinierten Nachrichtenverarbeitungs- oder Sendeknoten in der Programmiersprache C erstellt haben, können Sie dessen Funktionen erweitern.
Lesen Sie den Abschnitt Nachrichtenverarbeitungs- oder Sendeknoten in C erstellen.
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.)
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 unter cniElementAsBitstream.
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.
{
...
context = cniGetMessageContext(&rc, message));
outMsg = cniCreateMessage(&rc, context));
...
}
cniCopyElementTree(&rc, sourceElement, targetElement);
cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8);
cniDeleteMessage(&rc, outMsg);
cniCreateElementAsFirstChildUsingParser
cniCreateElementAsLastChildUsingParser
cniCreateElementAfterUsingParser
cniCreateElementBeforeUsingParser
cniCreateElementAsFirstChild
cniCreateElementAsLastChild
cniCreateElementAfter
cniCreateElementBefore
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 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 Rechenknoten hauptsächlich mit ESQL arbeitet, verwenden Sie einen Compute-Knoten.
cniFinalize(&rc, outMsg, CCI_FINALIZE_NONE);
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.
cniDeleteMessage(&rc, outMsg);
Eine umgewandelte Nachricht muss in einem Bitstrom serialisiert werden; eine Nachricht kann nur einmal serialisiert werden.
{
...
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 Sendeknoten beeinträchtigt.