Vorbereitungen
WebSphere Message Broker stellt die Quelle für die zwei benutzerdefinierten Beispielknoten 'Umschaltungsknoten' und 'Umsetzungsknoten' bereit. Sie können diese Knoten in ihrem aktuellen Zustand verwenden oder sie ändern. Des Weiteren können Sie das Beispiel zur benutzerdefinierten Erweiterung anzeigen, in dem die Verwendung benutzerdefinierter Knoten einschließlich eines in C geschriebenen Nachrichtenverarbeitungsknotens veranschaulicht wird.
Eine ladbare Implementierungsbibliothek (Loadable Implementation Library, LIL) ist das Implementierungsmodul für einen C-Knoten (oder -Parser). Eine LIL-Datei wird als DLL-Datei (Dynamic Link Library) implementiert. Sie hat die Dateierweiterung '.lil', nicht '.dll'.
Die Implementierungsfunktionen, die vom Entwickler geschrieben werden müssen, sind unter Implementierungsfunktionen für C-Knoten aufgelistet. Die Dienstprogrammfunktionen, die von WebSphere Message Broker bereitgestellt werden, um diesen Prozess zu unterstützen, sind unter Dienstprogrammfunktionen für C-Knoten aufgelistet.
WebSphere Message Broker stellt die Quelle für die zwei benutzerdefinierten Beispielknoten 'Umschaltungsknoten' und 'Umsetzungsknoten' bereit. Sie können diese Knoten in ihrem aktuellen Zustand verwenden oder sie ändern. Sie können auch das Beispiel für Beispielprogramm 'User-defined Extension' verwenden.
Konzeptionell wird ein Nachrichtenverarbeitungsknoten zur Verarbeitung einer Nachricht und ein Sendeknoten zur Ausgabe einer Nachricht als Bitstrom verwendet. Beim Codieren eines Nachrichtenverarbeitungsknotens und eines Sendeknotens handelt es sich jedoch um das Gleiche. 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, auch wenn die Funktionen beider Knotentypen erläutert werden.
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:
In der folgenden Prozedur wird beschrieben, wie Sie für Ihren Knoten eine Instanz erstellen können:
Attribute werden festgelegt, wenn Sie den Broker starten oder einen Nachrichtenfluss mit neuen Werten erneut einsetzen. Die Attribute werden von dem Broker festgelegt, der den Benutzercode im Konfigurations-Thread aufruft. Diese Attribute müssen im Bereich des Knotenkontexts des Benutzercodes gespeichert werden, damit sie später bei der Verarbeitung der Nachrichten verwendet werden können.
{ 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 Thread zur Nachrichtenverarbeitung aufgerufen und sollte entscheiden, auf welche Weise die Nachricht verarbeitet wird. 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. 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;
}