Fehler bei benutzerdefinierten Erweiterungen beheben

Einer der benutzerdefinierten Knoten kann nicht implementiert werden, obwohl ein LIL-Plug-in im korrekten Verzeichnis enthalten ist

Vorgehensweise

  • Szenario: Sie können einen Ihrer benutzerdefinierten Knoten nicht implementieren, obwohl sich eine Plug-in-LIL im richtigen Verzeichnis befindet.
  • Erläuterung: Sie haben memset() den Datenbereich auf null gesetzt und die Struktur CNI_VFT nicht mit der Initialisierungskonstante initialisiert {CNI_VFT_DEFAULT}.
  • Lösung: Initialisieren Sie wie folgt durch Kopieren einer vordefinierten Initialisierungsstruktur über den Funktionstabellenbereich:
    static CNI_VFT	virtualFunctionTable = {CNI_VFT_DEFAULT};

    Implementieren Sie zusätzlich aus Ihrem benutzerdefinierten Knoten die Protokollierung, damit Sie sehen können, ob durch die Plug-in-API Fehlercodes erzeugt werden. Diese werden vom Integrationsknoten nur dann in sein Protokoll geschrieben, wenn Sie einen Servicetrace verwenden.

Sie können einen Fluss nicht implementieren, wenn er einen der benutzerdefinierten Knoten enthält.

Vorgehensweise

  • Szenario: Sie können keinen Nachrichtenfluss implementieren, in dem sich einer Ihrer benutzerdefinierten Knoten befindet.
  • Erläuterung: Ihre LIL-Datei konnte nicht geladen werden.
  • Lösung: Überprüfen Sie das Systemprotokoll (syslog oder Ereignisanzeige) des Integrationsknotenstarts. Haben Sie die Nachricht BIP2308 angezeigt, dass eine LIL-Datei nicht geladen werden konnte? Wenn es Probleme beim Laden einer LIL-Datei gibt, wird im Systemprotokoll eine BIP2308-Nachricht angezeigt.

Es treten Probleme auf, wenn Knoten die Schnittstelle des ESQL-Pfads in der Plug-in-API verwenden möchten

Vorgehensweise

  • Szenario: Wenn Sie versuchen, die ESQL-Pfadschnittstelle in der Plug-in-API zu verwenden, lautet der Rückgabewert CCI_PATH_NOT_NAVIGABLE.
  • Erläuterung: Die Plug-in-API ermöglicht Ihnen, einen Pfad in Form eines ESQL-Pfadausdrucks anzugeben und zu diesem Element zu navigieren, wobei eine Kennung an dieses Element zurückgegeben wird, sofern vorhanden. Es ist außerdem möglich, auf dem Pfad zu dem angeforderten Element weitere Elemente zu erstellen.

    Durch die Dienstprogrammfunktion, mit der Sie zu dem Pfad navigieren (cniSqlNavigatePath), wird der Ausdruck 'SQLPathExpression' ausgeführt, der mit den Dienstprogrammfunktionen cniSqlCreateReadOnlyPathExpression oder cniSqlCreateModifiablePathExpression erstellt wurde, die im Argument sqlPathExpression definiert wurden.

    Wenn Sie nicht zu dem Pfad navigieren können, wurde für den Rückkehrcode CCI_PATH_NOT_NAVIGABLE festgelegt. Dieser Wert kann bei der Einbettung eines Pfadausdrucks in einen anderen Pfadausdruck zurückgegeben werden. Die Eingabefunktion cciMessage* darf nicht Null sein; die Ausgabefunktionen cciMessage* können jedoch Nullwerte enthalten. Wenn Sie einen Pfadausdruck, der NULL sein kann, in einen Pfadausdruck einbetten, der nicht NULL sein kann, wird CCI_PATH_NOT_NAVIGABLE zurückgegeben.

  • Lösung: Wenn der Rückkehrcode auf CCI_PATH_NOT_NAVIGABLE gesetzt ist, stellen Sie sicher, dass der entsprechende Parameter nicht NULL ist, wenn ein Korrelationsname in einem Pfad angegeben wird.

Nach der Migration funktioniert der benutzerdefinierte Eigenschafteneditor nicht

Vorgehensweise

  • Szenario: Sie haben auf eine neue Version von „ IBM® App Connect Enterprise “ aktualisiert, und Ihr benutzerdefinierter Eigenschaftseditor funktioniert nicht mehr.
  • Erläuterung: Editoren für angepasste Eigenschaften können Eclipse oder RAD-APIs verwenden. Sollten sich diese APIs in einer neuen Version von IBM App Connect Enterprise ändern, funktioniert Ihr Eigenschafteneditor möglicherweise nicht mehr.
  • Lösung: Aktualisieren Sie Ihren Eigenschafteneditorcode, sodass er der geänderten API entspricht.

Interpretation von Problemen in benutzerdefinierten Erweiterungen

Vorgehensweise

  • Szenario: Sie möchten Fehler in benutzerdefinierten Knoten und Parsern beheben.
  • Lösung: Starten Sie den Benutzertrace auf Debugstufe. Damit die Nachrichten BIP4142, BIP4144, BIP4145 und BIP4146 angezeigt werden, muss dies auf Integrationsserverebene ausgeführt werden. Verwenden Sie beispielsweise den Befehl mqsichangetrace ohne den Parameter -f .
    Die folgenden Debugnachrichten helfen Ihnen, die Ausführung Ihrer benutzerdefinierten Knoten und Parser zu verstehen:
    • BIP2233 und BIP2234: zwei zusammengehörige Nachrichten, die vor bzw. nach jedem Aufruf einer Implementierungsfunktion einer benutzerdefinierten Erweiterung aufgezeichnet werden. In diesen Nachrichten werden die Eingabeparameter und zurückgegebenen Werte angegeben. Zum Beispiel:

      BIP2233Invoking user-defined extension function [function name] ([function call parameters])

      BIP2234Returned from user-defined extension function [function name] with result: [result of call]
      Hinweis: In diesen Nachrichten kann eine Implementierungsfunktion als C-Implementierungsfunktion oder als Java™ -Implementierungsmethode interpretiert werden.
    • BIP2308: Eine Nachricht, die protokolliert wird, wenn der Integrationsknoten eine LIL-Datei nicht laden konnte.

      BIP2308File [name of LIL file] could not be loaded; operating system return code [error code return from operating system]

    • BIP3904: Eine Nachricht, für die vor dem Aufruf der Java-Methode evaluate() eines benutzerdefinierten Knotens ein Trace erstellt wird. Zum Beispiel:

      BIP3904(for Java): Invoking the evaluate() method of node (class=[node class name], name=[label of node in flow])Dabei ist Knotenname der Name der benutzerdefinierten Java-Erweiterungsklasse.

    • BIP3905: Nachricht, für die vor dem Aufrufen der C-Implementierungsfunktion cniEvaluate (iFpEvaluate ist dabei Mitglied der Struktur CNI_VFT) eines benutzerdefinierten Knotens ein Trace durchgeführt wurde. Zum Beispiel:

      BIP3905(for C): Invoking the cniEvaluate() implementation function of node (class=[node class name], name=[label of node in flow])Wo Knotenklassenname ist der Name der benutzerdefinierten Erweiterungsklasse, die von der benutzerdefinierten Erweiterung beim Aufruf von C bereitgestellt wird. cniDefineNodeClass.

    • BIP4142: Eine Debugnachricht, die beim Aufruf einer benutzerdefinierten Knoten-Dienstprogrammfunktion aufgezeichnet wird, wenn es sich um eine Dienstprogrammfunktion handelt, die den Zustand eines Syntaxelements verändert. Dazu gehören alle Dienstprogrammfunktionen, die mit cniSetElement* beginnen, wobei * für alle Knoten mit diesem Stamm steht. Zum Beispiel:

      BIP4142Evaluating cniSetElement [element identifier type]. Changing value from [value before user's change] to [value after user's change]"

    • BIP4144 und BIP4145: Zwei zusammengehörige Nachrichten, die vor bzw. nach jedem Aufruf bestimmter Implementierungsfunktionen aufgezeichnet werden, die, wenn sie von einer benutzerdefinierten Erweiterung aus aufgerufen werden, den internen Zustand eines Integrationsknotenobjekts modifizieren können. Zu den möglichen Integrationsknotenobjekten zählen Syntaxelemente, Knoten und Parser. Durch diese Nachrichten werden die Eingabeparameter aufgelistet, die für die aufgerufene Methode und den zurückgegebenen Wert bereitgestellt sind. Zum Beispiel:

      BIP4144Entered function [function name] ([function call parameters])

      BIP4145Exiting function [function name] with result: [result to be returned]

      In diesen Nachrichten kann eine Implementierungsfunktion entweder als C-Implementierungsfunktion oder als Java-Implementierungsmethode interpretiert werden.

      Zu den C-Implementierungsfunktionen, durch die die Nachrichten BIP4144 und BIP4145 aufgerufen werden, gehören die folgenden Methoden:

      Für benutzerdefinierte Parser Für benutzerdefinierte Knoten
      cpiCreateParserFactory cniCreateElement*
      cpiDefineParserClass cniDeleteMessage
      cpiAppendToBuffer cniAdd*
      cpiCreateElement cniDetach
      cpiCreateAndInitializeElement cniCopyElementTree
      cpiAddBefore cniFinalize
      cpiAddAfter cniWriteBuffer
      cpiAddAsFirstChild cniSql*
      cpiAddAsLastChild cniSetInputBuffer
      cpiSetNameFromBuffer cniDispatchThread

      (* stellt alle Knoten mit diesem Stamm dar; z. B. cniAdd* enthält cniAddAfter, cniAddasFirstChild, cniAddasLastChild und cniAddBefore.)

      Die folgenden Java-Methoden rufen die Nachrichten BIP4144 und BIP4145 auf:

      Für benutzerdefinierte Knoten
      com.ibm.broker.plugin.MbElement.CreateElement*
      com.ibm.broker.plugin.MbElement.add*
      com.ibm.broker.plugin.MbElement.detach
      com.ibm.broker.plugin.MbElement.copyElementTree
    • BIP4146: Eine Debugnachricht, die beim Aufruf einer benutzerdefinierten Parser-Dienstprogrammfunktion aufgezeichnet wird, wenn es sich um eine Dienstprogrammfunktion handelt, die den Zustand eines Syntaxelements verändert. Dazu gehören alle Dienstprogrammfunktionen, die mit cpiSetElement* beginnen, wobei * für alle Knoten mit diesem Stamm steht. Zum Beispiel:

      BIP4146Evaluating cpiSetElement [element identifier type]. Changing value from [value before user's change] to [value after user's change]

      Informationen zur benutzerdefinierten C-API finden Sie unter Benutzerdefinierte Parser-API in der Programmiersprache C und unter Benutzerdefinierte Knoten-API in der Programmiersprache C.

    • BIP4147: Eine Fehlernachricht, die aufgezeichnet wird, wenn von einer benutzerdefinierten Erweiterung ein ungültiges Eingabeobjekt an die API-Dienstprogrammfunktion einer benutzerdefinierten Erweiterung übergeben wird. Beispiel:

      BIP4147User-defined extension input parameter failed debug validation check. Input parameter [parameter name] passed into function [function name] is not a valid object.

    • BIP4148: Fehlernachricht, für die ein Trace durchgeführt wird, wenn das Objekt eines Integrationsknotens durch eine benutzerdefinierte Erweiterung beschädigt wird. Beispiel:

      BIP4148User-defined extension damaged an integration node object. Function [function name] has damaged integration node object passed as parameter [parameter name].

    • BIP4149: Eine Fehlernachricht, die aufgezeichnet wird, wenn von einer benutzerdefinierten Erweiterung ein ungültiger Eingabedatenzeiger an die API-Dienstprogrammfunktion einer benutzerdefinierten Erweiterung übergeben wird. Beispiel:

      BIP4149User-defined extension input parameter failed debug validation check. Input parameter [parameter name] passed into function [function name] is a NULL pointer.

    • BIP4150: Eine Fehlernachricht, die aufgezeichnet wird, wenn von einer benutzerdefinierten Erweiterung ungültige Eingabedaten an die API-Dienstprogrammfunktion einer benutzerdefinierten Erweiterung übergeben werden. Zum Beispiel:

      BIP4150User-defined extension input parameter failed debug validation check. Input parameter [parameter name] passed into function [function name] does not have a valid value.

    • BIP4151: Eine Debugnachricht, die aufgezeichnet wird, wenn von cniGetAttribute2 oder cniGetAttributeName2 der Rückkehrwert auf einen nicht erwarteten Wert gesetzt wird. Erwartete Werte sind CCI_SUCCESS, CCI_ATTRIBUTE_UNKNOWN und CCI_BUFFER_TOO_SMALL. Alle anderen Werte sind unerwartete Werte. Zum Beispiel:

      BIP4151An unexpected value was returned from User-defined extension implementation function [function name].

    • BIP4151: Debugnachricht, für die ein Trace ausgeführt wird, wenn cniGetAttribute2 oder cniGetAttributeName2 den Rückkehrcode auf CCI_BUFFER_TOO_SMALL setzt. Obwohl cniGetAttribute2 oder cniGetAttributeName2 anschließend erneut und mit der richtigen Puffergröße aufgerufen werden, hat der Rückkehrcode weiterhin den Wert CCI_BUFFER_TOO_SMALL. Zum Beispiel:

      BIP4152User-defined extension Implementation function [function name] returned CCI_BUFFER_TOO_SMALL on 2nd attempt.

Sie möchten einen Debug für das Laden von Klassen ausführen

Vorgehensweise

  • Szenario: Sie möchten das Laden von Klassen debuggen.
  • Lösung: Klassen und die Position, von der sie geladen werden, werden in den Benutzertrace geschrieben. Überprüfen Sie anhand dieser Informationen, ob die korrekten Klassen geladen werden.

Beim Implementieren einer benutzerdefinierten Erweiterung unter Linux wird ein Fehler ausgegeben.

Vorgehensweise

  • Szenario: Wenn Sie eine benutzerdefinierte Erweiterung unter Linux® implementieren, wird im Protokoll jedes Integrationsservers ein Fehler angezeigt, der angibt, dass die Berechtigung zum Öffnen der LIL-Datei nicht ausreicht.
  • Erläuterung: Unter Linux muss die benutzerdefinierte Erweiterung über Gruppenleseberechtigung verfügen.
  • Lösung:
    Legen Sie unter Linux die Dateiberechtigungen der benutzerdefinierten Erweiterung auf "group read" fest, indem Sie den Befehl chmod a+r absetzen.

Sie können nicht feststellen, welche benutzerdefinierten Erweiterungen während des Systemstarts vom Integrationsknoten geladen wurden

Vorgehensweise

  • Szenario: Sie können nicht ermitteln, welche benutzerdefinierten Erweiterungen vom Integrationsknoten beim Start geladen wurden.
  • Lösung: Verwenden Sie den Befehl mqsireportproperties für alle Typen benutzerdefinierter Erweiterungen.
    • Geben Sie für eine benutzerdefinierte Java-Erweiterung den folgenden Befehl aus:
      mqsireportproperties INODE -e default -o ComIbmJavaPluginNodeFactory -r

      Es wird ein Bericht angezeigt, der etwa wie folgt aussieht:

      ComIbmJavaPluginNodeFactory
      	uuid='ComIbmJavaPluginNodeFactory'
      	userTraceLevel='none'
      	traceLevel='none'
      	userTraceFilter='none'
      	traceFilter='none'
      	NodeClassName='ComIbmJMSClientInputNode'
      	NodeClassName='ComIbmJMSClientOutputNode'
      	NodeClassName='ComIbmJavaComputeNode'
      	NodeClassName='ComIbmXslMqsiNode'
      	NodeClassName='SearchFilterNode'
      
      BIP8071I: Successful command completion.

      Die benutzerdefinierte Erweiterung mit der Bezeichnung 'SearchFilter' hat den Knotenklassennamen 'SearchFilterNode'.

    • Geben Sie für eine benutzerdefinierte C-Erweiterung (vorausgesetzt, dass für CONST_PLUGIN_NODE_FACTORY in der Datei NodeFactory.h wie im Beispiel 'NumComputeNode' 'ComIbmSamplePluginNodeFactory' festgelegt wurde) folgenden Befehl aus:
      mqsireportproperties INODE -e default -o ComIbmSamplePluginNodeFactory -r
      
      

      Es wird ein Bericht angezeigt, der etwa wie folgt aussieht:

      ComIbmSamplePluginNodeFactory
      	uuid='ComIbmSamplePluginNodeFactory'
      	userTraceLevel='none'
      	traceLevel='none'
      	userTraceFilter='none'
      	traceFilter='none'
      	NodeClassName='NumComputeNode'
      	
      BIP8071I: Successful command completion.

      Die benutzerdefinierte Erweiterung mit der Bezeichnung 'NumCompute' hat den Knotenklassennamen 'NumComputeNode'.

Beim Migrieren eines benutzerdefinierten C-Knotens gibt 'cniDefineNodeClass' den Wert 'CCI_INV_IMPL_FUNCTION' zurück.

Vorgehensweise

  • Szenario: Wenn Sie versuchen, einen benutzerdefinierten C-Knoten zu migrieren, gibt cniDefineNodeClass CCI_INV_IMPL_FUNCTION zurück.
  • Erläuterung: Der Struktur CNI_VFT wurden neue Felder hinzugefügt. CNI_VFT_DEFAULT wurde aktualisiert, um diese neuen Felder in der Headerdatei BipCci.h zu initialisieren. Wenn Sie CNI_VFT mit CNI_VFT_DEFAULT initialisieren, müssen Sie keine Codeänderungen vornehmen. Wenn Sie die Struktur 'CNI_VFT' jedoch nicht mit 'CNI_VFT_DEFAULT' initialisieren, werden diese neuen Felder mit zufälligen Werten initialisiert.
  • Lösung: Initialisieren Sie CNI_VFT mit CNI_VFT_DEFAULT.