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.

cciRegisterForThreadStateChange

Diese Funktion registriert eine Funktion, die aufzurufen ist, wenn der aktuelle Thread in einen bestimmten Zustand geht.

Syntax

void cciRegisterForThreadStateChange(
          int               *returnCode,
          CciThreadContext  *threadContext,
          CciDataContext    *userContext,
          CciRegCallback     callback,
          CciCallbackType    type);

Parameter

returnCode
Der Rückkehrcode von der Funktion (Ausgabe).Wenn der Eingabewert NULL ist, zeigt dies an, dass Fehler vom Broker stillschweigend bearbeitet oder ignoriert werden. Wenn der Eingabewert nicht NULL ist, gibt der Ausgabewert den Erfolgsstatus des Aufrufs an. Wenn der Parameter threadContext keinen gültigen Wert hat, wird *returnCode auf CCI_INV_THREAD_CONTEXT gesetzt und der Callback wird nicht registriert.
threadContext
Dieser Parameter stellt den Threadkontext bereit, in dem die Callback-Funktion und die dazugehörigen Daten zu registrieren sind. Es wird davon ausgegangen, dass dieser Parameter durch Aufruf von cniGetThreadContext() auf dem aktuellen Thread ermittelt wird. Wenn als Threadkontext (threadContext) NULL übergeben wird, wird der Threadkontext durch die Rahmendefinition bestimmt. Diese Methode ist allerdings nicht so effizient wie ein Aufruf von cniGetThreadContext.
userContext
Dieser Parameter ermöglicht es dem Aufrufenden, einen Kontextzeiger anzugeben, der beim Aufruf der Callback-Funktion an diese übergeben wird. Dieser Parameter darf NULL sein.
callback
Dieser Parameter ist ein Zeiger auf die aufzurufende Callback-Funktion. Diese Funktion muss vom Typ CciRegCallback sein.
type
Dieser Parameter gibt an, ob der Callback bei Beendigung des Threads aufzurufen ist oder dann, wenn sich der Thread in einem der Inaktiv-Status befindet. Bei den Inaktiv-Status kann es sich um einen der folgenden Werte handeln:
  • CCI_THREAD_STATE_IDLE:

    Der Empfangsknoten für den aktuellen Thread fragt aktiv nach Daten aus der Eingabequelle, aber es sind keine Daten verfügbar. Es werden erst Nachrichten im Nachrichtenfluss weitergegeben, wenn Daten für den Empfangsknoten verfügbar werden.

  • CCI_THREAD_STATE_INSTANCE_END

    Der Empfangsknoten für den aktuellen Thread hat aufgehört, nach Daten zu fragen, und der Thread ist wieder freigegeben worden. Der Thread wird entweder von demselben Empfangsknoten oder einem anderen Empfangsknoten in demselben Nachrichtenfluss erneut zugeteilt. In diesen Status wird gewechselt, wenn zusätzliche Instanzen, die für einen Nachrichtenfluss implementiert worden waren, konfiguriert wurden, um mit einem Zustrom von Daten zurechtzukommen, der nun aufgehört hat. Der Empfangsknoten fragt auf einem Einzelthread weiterhin Eingabedaten ab und die übrigen Threads werden freigegeben.

  • CCI_THREAD_STATE_TERMINATION

    Der aktuelle Thread endet. Dies kann geschehen, wenn der Broker beendet wird, der Ausführungsgruppenprozess kontrolliert endet oder der Nachrichtenfluss gelöscht wird. Dies kann vorkommen, nachdem alle Knoten und Parser im Fluss gelöscht worden sind.

Alternativ kann es sich beim Parameter type um das Ergebnis einer bitweisen ODER-Operation für zwei oder mehr von diesen Werten handeln. In diesem Fall wird die angegebene Funktion aufgerufen, wenn der Thread für jeden einzelnen type-Wert in den betreffenden Status geht.

Rückgabewerte

Keine. Wenn ein Fehler auftritt, gibt der Parameter returnCode die Fehlerursache an.

Beispiel

Deklarieren von 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 derselbe 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 | as24630_