WebSphere Message Broker Version 8.0.0.5 Betriebssysteme: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Sehen Sie sich die Informationen zur aktuellen Produktversion im IBM Integration Bus Version 9.0 an.

Benutzerdefinierten Parser implementieren

Sie können einen benutzerdefinierten Parser erstellen, um Nachrichten mit unterschiedlichem Format und Struktur zu interpretieren.

Vor dem Start

Eine ladbare Implementierungsbibliothek (Loadable Implementation Library, LIL) ist das Implementierungsmodul für einen C-Parser (oder -Knoten). Eine LIL-Datei ist ein gemeinsam genutztes Linux- oder UNIX-Objekt oder eine Windows-DLL-Datei, die nicht die Datenerweiterung .dll, sondern .lil hat.

Die Implementierungsfunktionen, die von Ihnen erstellt werden müssen, sind im Abschnitt C-Parser-Implementierungsfunktionen aufgelistet. Die Dienstprogrammfunktionen, die von WebSphere Message Broker zu Ihrer Unterstützung bereitgestellt werden, sind unter C-Parser-Dienstprogrammfunktionen aufgelistet.

WebSphere Message Broker stellt den Quellcode für einen benutzerdefinierten Musterparser mit dem Namen 'BipSampPluginParser.c' bereit. Dieses Beispiel ist ein einfacher Pseudo-XML-Parser, den Sie in seinem aktuellen Zustand verwenden oder ändern können.

Der Schreibvorgang für einen Parser kann je nach Komplexität des Bitstroms, der analysiert werden soll, beträchtlich variieren. Hier werden nur die grundlegenden Schritte beschrieben:
  1. Parser deklarieren und definieren
  2. Instanz des Parsers erstellen
  3. Instanz des Parsers löschen

Parser deklarieren und definieren

Sie müssen zum Deklarieren und Definieren eines benutzerdefinierten Parsers für den Broker eine Initialisierungsfunktion, bipGetParserFactory, in Ihrer LIL einfügen. Im Folgenden wird erläutert, wie die Initialisierungsfunktion vom Broker aufgerufen wird und wie durch diese Funktion der benutzerdefinierte Parser deklariert und definiert wird:

In der folgenden Prozedur wird beschrieben, wie Sie Ihren Parser im Broker deklarieren und definieren:

  1. Die Initialisierungsfunktion bipGetParserFactory wird vom Broker aufgerufen, nachdem die LIL-Datei vom Betriebssystem geladen und initialisiert wurde. Der Broker ruft diese Funktion auf, um festzustellen, was mit der LIL-Datei möglich ist und wie sie aufgerufen werden muss. Beispiel:
    CciFactory LilFactoryExportPrefix * LilFactoryExportSuffix
    bipGetParserFactory()
  2. Durch die Funktion bipGetParserFactory wird die Dienstprogrammfunktion cpiCreateParserFactory aufgerufen. Diese Funktion gibt für alle Parser, die von der LIL-Datei unterstützt werden, einen eindeutigen Factory-Namen (oder Gruppennamen) zurück. Jeder zurückgegebene Factory-Name (oder Gruppenname) muss für alle LIL-Dateien im Broker eindeutig sein.
  3. Durch die LIL-Datei wird anschließend die Dienstprogrammfunktion cpiDefineParserClass für die Übergabe der eindeutigen Namen der einzelnen Parser und eine virtuelle Funktionstabelle mit den Adressen der Implementierungsfunktionen aufgerufen.
    Der folgende Code deklariert und definiert beispielsweise einen einzelnen Parser namens InputxParser:
    {
    	CciFactory*      factoryObject;
    	int                rc = 0;
    		CciChar factoryName[] = L"MyParserFactory";
    		CCI_EXCEPTION_ST exception_st;
    
    		/* Create the Parser Factory for this parser */
    		factoryObject = cpiCreateParserFactory(0, factoryName);
    	if (factoryObject == CCI_NULL_ADDR) {
    		
    		/* Any local error handling can go here */
    	}
    	else {
    				/* Define the parsers supported by this factory */
    		static CNI_VFT vftable = {CNI_VFT_DEFAULT};
    
    	/* Funktionstabelle mit Zeigern auf Parserimplementierungsfunktionen erstellen */
    	vftable.iFpCreateContext            = cpiCreateContext;
    	vftable.iFpParseBufferEncoded       = cpiParseBufferEncoded;
    	vftable.iFpParseFirstChild          = cpiParseFirstChild;
    	vftable.iFpParseLastChild           = cpiParseLastChild;
    	vftable.iFpParsePreviousSibling     = cpiParsePreviousSibling;
    	vftable.iFpParseNextSibling         = cpiParseNextSibling;
    	vftable.iFpWriteBufferEncoded       = cpiWriteBufferEncoded;
    	vftable.iFpDeleteContext            = cpiDeleteContext;
    	vftable.iFpSetElementValue          = cpiSetElementValue;
    	vftable.iFpElementValue             = cpiElementValue;
    	vftable.iFpNextParserClassName      = cpiNextParserClassName;
    	vftable.iFpSetNextParserClassName   = cpiSetNextParserClassName;
    	vftable.iFpNextParserEncoding       = cpiNextParserEncoding;
    	vftable.iFpNextParserCodedCharSetId = cpiNextParserCodedCharSetId;
    
    		cpiDefineParserClass(0, factoryObject, L"InputxParser", &vftable);
    	}
    
    	/* Rückkehradresse dieses Factory-Objekts zum Broker */
    	return(factoryObject);
    }

    Die Initialisierungsfunktion muss eine Parser-Factory durch Aufruf von cpiCreateParserFactory erstellen. Die von der Factory unterstützten Parser-Klassen werden durch den Aufruf von cpiDefineParserClass definiert. Die Adresse des Factory-Objekts (von cpiCreateParserFactory zurückgegeben) muss von der Initialisierungsfunktion als Rückgabewert an den Broker zurückgegeben werden.

    Beispiel:
    1. Erstellen Sie die Parser-Factory mithilfe der Funktion cpiCreateParserFactory:
        factoryObject = cpiCreateParserFactory(&rc, constParserFactory);
        
    2. Definieren Sie die von der Factory unterstützten Nachrichtenklassen mit der Funktion cpiDefineParserClass:
      if (factoryObject) {
         cpiDefineParserClass(&rc, factoryObject, constPXML, &vftable);
        }
      else {
          /* Fehler: Parser-Factory kann nicht erstellt werden */
        }
    3. Geben Sie die Adresse dieses Factory-Objekts an den Broker zurück:
        return(factoryObject);
      }

Instanz des Parsers erstellen

Wenn der Broker die Tabelle mit den Funktionszeigern erhalten hat, ruft er für jede Instanzerstellung des benutzerdefinierten Parsers die Funktion cpiCreateContext auf. Wenn drei Nachrichtenflüsse vorhanden sind, die Ihren benutzerdefinierten Parser verwenden, wird die FunktioncpiCreateContext für jeden dieser Parser aufgerufen. Mit dieser Funktion wird Speicher für die Instanziierung des benutzerdefinierten Parsers reserviert, in dem die Werte für die konfigurierten Attribute gespeichert werden. Beispiel:
  1. Rufen Sie die Funktion cpiCreateContext auf:
    CciContext* _createContext(
      CciFactory* factoryObject,
      CciChar* parserName,
      CciNode* parserObject
    ){
      static char* functionName = (char *)"_createContext()";
      PARSER_CONTEXT_ST* p;
      CciChar          buffer[256];
  2. Ordnen Sie dem lokalen Kontext einen Zeiger zu, und löschen Sie den Kontextbereich:
      p = (PARSER_CONTEXT_ST *)malloc(sizeof(PARSER_CONTEXT_ST));
    
      if (p) {
         memset(p, 0, sizeof(PARSER_CONTEXT_ST));
  3. Speichern Sie den Zeiger des Parserobjekts im Kontext:
       p->parserObject = parserObject;
  4. Speichern Sie den Parsernamen:
     CciCharNCpy((CciChar*)&p->parserName, parserName, MAX_NODE_NAME_LEN);
  5. Geben Sie den Parserkontext zurück:
    return (CciContext*) p;

Instanz des Parsers löschen

Parser werden beim Löschen oder erneuten Implementieren eines Nachrichtenflusses oder beim Stoppen des Prozesses der Ausführungsgruppe mithilfe des Befehls mqsistop gelöscht. Durch das Löschen des Parsers müssen der verwendete Speicher und darin enthaltene Ressourcen mithilfe der Funktion cpiDeleteContext freigegeben werden. Beispiel:

void cpiDeleteContext(
  CciParser*  parser,
  CciContext* context
){
  PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
  int                rc = 0;

  return;
}
Bemerkungen | Marken | Downloads | Bibliothek | Support | Feedback

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        Letzte Aktualisierung:
        
        Letzte Aktualisierung: 2015-02-28 16:22:06


TaskthemaTaskthema | Version 8.0.0.5 | as10010_