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.

cciRegCallback

Diese Funktion kann als Callback-Funktion registriert werden und wird dann aufgerufen, wenn das registrierte Ereignis auftritt. Die Funktion wird registriert, indem ein Funktionszeiger angegeben wird, der zu einer bestimmten Typendefinition (typedef) passt.

Syntax

typedef int (*CciRegCallback)(CciDataContext *, cciCallbackType);

Parameter

type CciDataContext*
Dieser Parameter ist der Zeiger, der vom Aufrufenden der Registrierungsfunktion zur Verfügung gestellt wird.
type CciCallbackType
Dieser Parameter gibt den Grund für den Callback an. Es handelt sich dabei stets um einen der CciCallbackType-Werte, der bei dem Registrierungsaufruf, der diesem Callback entspricht, angegeben wird.

Rückgabewerte

type CciRegCallbackStatus (in BipCci.h definiert)

  • CCI_THREAD_STATE_REGISTRATION_RETAIN: Dieser Rückkehrcode wird für einen Callback verwendet, der weiterhin als Callback-Funktion auf einem bestimmten Thread registriert sein soll.
  • CCI_THREAD_STATE_REGISTRATION_REMOVE: Dieser Rückkehrcode wird verwendet, um zu signalisieren, dass der Callback zu deregistrieren ist und auf diesem Thread nicht mehr aufgerufen werden darf, es sei denn, er wird erneut registriert.
  • Wenn ein anderer Wert zurückgegeben wird, wird eine Warnung in ein Protokoll geschrieben und CCI_THREAD_STATE_REGISTRATION_RETAIN angenommen.
Während der Ausführung dieser Funktion kann es vorkommen, dass der Knoten oder Parser, der die Funktion registriert hat, bereits gelöscht worden ist. Daher dürfen Sie keine Knoten- oder Parser-Dienstprogrammfunktion aufrufen, die vom Vorhandensein eines Knotens oder Parsers ausgehen. Die einzigen Dienstprogrammfunktionen, die von diesem Callback aus aufgerufen werden können, sind:
  • cciLog
  • cciUserTrace
  • cciServiceTrace
  • cciUserDebugTrace
  • cciServiceDebugTrace
  • cciIsTraceActive

Bei jeder dieser fünf Tracedienstprogrammfunktionen muss der Parameter CciObject NULL sein.

Beispiel

Deklarieren Sie folgendermaßen Struct und Funktion:

typedef struct {
    int         id;
}MyContext;

static int registered=0;

CciRegCallbackStatus switchThreadStateChange(CciDataContext *context, CciCallbackType type)
{
  char traceText[256];
  char* typeStr=0;
  MyContext* myContext = (MyContext*)context;

  if (type==CCI_THREAD_STATE_IDLE){
      typeStr = "idle";      
  }else if(type==CCI_THREAD_STATE_INSTANCE_END){
      typeStr = "instance end";
  }else if (type==CCI_THREAD_STATE_TERMINATION){
      typeStr = "termination";
  }else{
      typeStr = "unknown";
  }

  memset(traceText,0,256);
  sprintf(traceText,"switchThreadStateChange: context id = %d, thread state %s",myContext->id,typeStr);
  cciServiceTrace(NULL,
                  NULL,
                  traceText);
  return CCI_THREAD_STATE_REGISTRATION_RETAIN;

}

Fügen Sie den folgenden Code in die Funktion _Switch_evaluate aus den mitgelieferten Mustercodes ein, um den Service-Trace lesen und sehen zu können, wann der Nachrichtenverarbeitungsthread seinen Status wechselt:

/*für Thread-Statuswechsel registrieren*/
  CciMessageContext* messageContext = cniGetMessageContext(NULL,message);
  CciThreadContext*  threadContext  = cniGetThreadContext(NULL,messageContext);
  
  static MyContext myContext={1};  

  if(registered==0){
    cciRegisterForThreadStateChange(
                   NULL,
                   threadContext,
                   & myContext,
                   switchThreadStateChange,
                   CCI_THREAD_STATE_IDLE | 
                   CCI_THREAD_STATE_INSTANCE_END |
                   CCI_THREAD_STATE_TERMINATION);

    registered=1;
  
  }

In diesem Beispiel wird nur der erste Thread registriert, der eine Nachricht empfängt. Wenn es nötig ist, jeden Thread zu registrieren, der eine Nachricht empfängt, dann müssen die benutzerdefinierten Erweiterungen sich merken, auf welchen Threads sie sich registriert haben.

Mithilfe des Parameters userContext können Sie nachvollziehen, wie Daten von dem Code aus, in dem der Callback registriert wird, an die eigentliche Callback-Funktion übergeben werden.

Beim Registrieren des Callbacks wird ein Zeiger auf eine Instanz des Structs MyContext übergeben. Dies ist der Zeiger, der an den Callback zurückgegeben wird. Um sicher zu stellen, dass der Zeiger noch gültig ist, wenn er an den Callback zurück übergeben wird, wird ein Instanz des Structs als statisch deklariert. Ein anderes Vorgehen, um sicher zu stellen, dass der Zeiger gültig ist, ist, Speicherplatz auf dem Heap zuzuweisen.

In der Callback-Funktion kann der Parameter userContext in den Typ (MyContext*) konvertiert werden. Das ursprüngliche Struct MyContext kann durch diese Adresse referenziert werden. Mit diesem Verfahren ist es möglich, Daten von dem Code aus, in dem der Callback registriert wird, an die Callback-Funktion zu übergeben.

Bemerkungen | Marken | Downloads | Bibliothek | Support | Feedback

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

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


ReferenzthemaReferenzthema | Version 8.0.0.5 | as24650_