Vorbereitungen
Eine ladbare Implementierungsbibliothek (Loadable Implementation Library, LIL) ist das Implementierungsmodul für einen C-Knoten (oder -Parser). Eine LIL ist als DLL-Datei implementiert. Sie hat jedoch nicht die Dateierweiterung .dll, sondern .lil.
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 'TransformNode' bereit. Sie können diese Knoten in ihrem aktuellen Zustand verwenden, oder Sie können sie ändern. Sie können auch das Beispiel für Benutzerdefinierte Erweiterung verwenden.
Konzeptionell wird ein Nachrichtenverarbeitungsknoten zur Verarbeitung einer Nachricht und ein Sendeknoten zur Ausgabe einer Nachricht als Bitstrom verwendet. Wenn Sie jedoch einen Nachrichtenverarbeitungsknoten oder einen Sendeknoten codieren, sind sie im Wesentlichen identisch. Sie können an einem Sendeknoten Nachrichten verarbeiten, und ebenso können Sie mit einem Nachrichtenverarbeitungsknoten eine Nachricht als Bitstrom ausgeben. Der Einfachheit halber wird der Knoten in diesem Abschnitt hauptsächlich als Nachrichtenverarbeitungsknoten bezeichnet, es werden jedoch die Funktionen beider Knotentypen beschrieben.
Im Folgenden wird die Vorgehensweise bei der Deklaration des Knotens beim Broker beschrieben:
void defineSwitchNode(void* factoryObject){ static CNI_VFT vftable = {CNI_VFT_DEFAULT}; /* Setup function table with pointers to node implementation functions */ vftable.iFpCreateNodeContext = _createNodeContext; vftable.iFpDeleteNodeContext = _deleteNodeContext; vftable.iFpGetAttributeName2 = _getAttributeName2; vftable.iFpSetAttribute = _setAttribute; vftable.iFpGetAttribute2 = _getAttribute2; vftable.iFpEvaluate = _evaluate; cniDefineNodeClass(0, factoryObject, L"SwitchNode", &vftable); return; }Diese Funktion wird vom Konfigurations-Thread aus ausgerufen.
Ein benutzerdefinierter Knoten identifiziert sich selbst als Nachrichtenverarbeitungsknoten oder Sendeknoten, indem er die Funktion cniEvaluate implementiert. Benutzerdefinierte Empfangsknoten müssen eine cniEvaluate- und/oder cniRun-Implementierungsfunktion implementieren, ansonsten lädt der Broker den benutzerdefinierten Knoten nicht, und die Dienstprogrammfunktion cniDefineNodeClass schlägt mit dem Rückkehrcode CCI_MISSING_IMPL_FUNCTION fehl.
Wenn ein Nachrichtenfluss, der einen benutzerdefinierten Nachrichtenverarbeitungsknoten enthält, erfolgreich implementiert wird, wird die Funktion cniEvaluate des Knotens für jede Nachricht, die den Nachrichtenfluss durchläuft, aufgerufen.
Nachrichtenflussdaten, d. h. die Nachricht, die globale Umgebung, die lokale Umgebung und die Ausnahmeliste, werden am Eingabeterminal des Knotens empfangen.
void cniEvaluate( CciContext* context, CciMessage* destinationList, CciMessage* exceptionList, CciMessage* message ){ ... }
Im Folgenden wird die Vorgehensweise bei der Erstellung einer Instanz des Knotens beschrieben:
Attribute werden festgelegt, wenn Sie den Broker starten oder wenn Sie einen Nachrichtenfluss mit neuen Werten erneut implementieren. Attributes werden vom Broker durch Aufrufen von Benutzercode im Konfigurations-Thread festgelegt. 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 abruft und diese Nachricht am Eingabeterminal Ihres benutzerdefinierten Nachrichtenverarbeitungs- oder Sendeknotens eingeht, ruft der Broker die Implementierungsfunktion cniEvaluate auf. Diese Funktion wird im Nachrichtenverarbeitungs-Thread aufgerufen und sollte entscheiden, welche Maßnahmen für die Nachricht ergriffen werden. Diese Funktion kann in mehreren Threads aufgerufen werden, vor allem, wenn zusätzliche Instanzen verwendet werden.
Zum Löschen einer Instanz eines Knotens verwenden Sie die Funktion cniDeleteNodeContext. Beispiel:
void _deleteNodeContext( CciContext* context ){ static char* functionName = (char *)"_deleteNodeContext()"; return; }
Die Funktion cniDeleteNodeContext wird vom Benutzer bereitgestellt und wird vom Broker aufgerufen, wenn ein Nachrichtenfluss gelöscht wird.