Ein Nachrichtenverarbeitungsknoten wird zur Verarbeitung einer Nachricht und ein Sendeknoten zur Ausgabe einer Nachricht als Bitstrom verwendet.
Im Hinblick auf die Codierung eines Nachrichtenverarbeitungsknotens und eines Sendeknotens lässt sich feststellen, dass die Knoten im Wesentlichen dieselben Services bereitstellen. Sie können an einem Sendeknoten Nachrichten verarbeiten, und ebenso können Sie mit einem Nachrichtenverarbeitungsknoten eine Nachricht als Bitstrom ausgeben. Zur Vereinfachung wird in diesem Abschnitt von einem Nachrichtenverarbeitungsknoten gesprochen, es sind jedoch auch Informationen zu den Funktionen beider Knotentypen enthalten.
Eine ladbare Implementierungsbibliothek (LIL) ist das Implementierungsmodul für einen C-Knoten. Eine LIL wird als gemeinsam genutzte Bibliothek oder als Dynamic Link Library (DLL) implementiert, hat jedoch die Dateierweiterung .lil, nicht .dll.
Weitere Informationen zu den C-Knoten-Implementierungsfunktionen, die Sie für den Knoten schreiben, erhalten Sie im Abschnitt Implementierungsfunktionen für C-Knoten. Sie können C-Knoten-Dienstprogrammfunktionen aufrufen, die im Laufzeitbroker implementiert sind, um die Knotenoperation zu unterstützen; weitere Informationen erhalten Sie im Abschnitt Dienstprogrammfunktionen für C-Knoten.
Sie müssen zum Deklarieren und Definieren eines benutzerdefinierten Knotens für den Broker eine Initialisierungsfunktion, bipGetMessageflowNodeFactory, in Ihrer LIL einfügen. Die folgenden Schritte werden im Konfigurations-Thread ausgeführt und legen fest, wie die Initialisierungsfunktion vom Broker aufgerufen wird und wie durch diese Funktion der benutzerdefinierte Knoten deklariert und definiert wird:
Attribute werden festgelegt, wenn Sie den Broker starten oder einen Nachrichtenfluss mit neuen Werten erneut implementieren. Die Attribute werden von dem Broker festgelegt, der den Benutzercode im Konfigurations-Thread aufruft. Der Benutzercode muss diese Attribute zur späteren Verwendung bei der Verarbeitung von Nachrichten im Knotenkontextbereich speichern.
{ const CciChar* ucsAttr = CciString("nodeTraceSetting", BIP_DEF_COMP_CCSID) ; insAttrTblEntry(p, (CciChar*)ucsAttr, CNI_TYPE_INTEGER); _setAttribute(p, (CciChar*)ucsAttr, (CciChar*)constZero); free((void *)ucsAttr) ; } { const CciChar* ucsAttr = CciString("nodeTraceOutfile", BIP_DEF_COMP_CCSID) ; insAttrTblEntry(p, (CciChar*)ucsAttr, CNI_TYPE_STRING); _setAttribute(p, (CciChar*)ucsAttr, (CciChar*)constSwitchTraceLocation); free((void *)ucsAttr) ; }
Wenn der Broker eine Nachricht aus der Warteschlange empfängt und diese Nachricht den Eingabeterminal Ihres benutzerdefinierten Nachrichtenverarbeitungs- oder Sendeknoten erreicht, wird vom Broker die Implementierungsfunktion cniEvaluate aufgerufen. Diese Funktion wird im Nachrichtenverarbeitungs-Thread aufgerufen und muss entscheiden, welche Maßnahmen für die Nachricht ergriffen werden. Möglicherweise wird diese Funktion in mehreren Threads aufgerufen, besonders bei Verwendung von zusätzlichen Instanzen.
Wird ein Knoten gelöscht, ruft der Broker die Funktion cniDeleteNodeContext auf. Diese Funktion wird im gleichen Thread gestartet wie cniCreateNodeContext. Von dieser Funktion müssen alle Ressourcen freigegeben werden, die von Ihrem benutzerdefinierter Knoten verwendet werden. Beispiel:
void _deleteNodeContext( CciContext* context ){ static char* functionName = (char *)"_deleteNodeContext()"; free ((void*) context); return; }