Verarbeitung asynchroner Nachrichten und Callback-Routinen
Die asynchrone Nachrichtenverarbeitung, die in Version 7 oder höher von IBM® MQ verfügbar ist, verwendet die MQI-Aufrufe MQCB und MQCTL. Wenn Sie diese Funktionen in einem CICS® Anwendungsprogramm verwenden, führt CICS einige Aspekte der Verarbeitung aus. Wenn Sie Ihre Anwendung codieren, müssen Sie daher zusätzlich zur IBM MQ -Programmierdokumentation die hier bereitgestellten Informationen verwenden.
Um die asynchrone Nachrichtenverarbeitung IBM MQ zu nutzen, können Sie als Callback-Routinen bezeichnete Programme für mehrere Nachrichtenziele, einschließlich Warteschlangen und Themen, registrieren. Wenn eine geeignete Nachricht an das Ziel gesendet wird, wird sie an die Rückrufroutine weitergeleitet. Sie können auch Event-Handler einrichten, um über Bedingungen wie das Beenden eines Warteschlangenmanagers benachrichtigt zu werden.
Wenn Sie ein Anwendungsprogramm auf CICS -Befehlsebene als Rückrufroutine registrieren, ruft CICS die von IBM MQ übergebenen Nachrichten ab und stellt mithilfe von EXEC CICS LINK eine Verbindung zur Rückrufroutine her. CICS übergibt die Nachrichtendaten in einer Reihe von Containern auf einem Kanal an die Callback-Routine.
- Ihre Callback-Routine kann in jeder von CICS unterstützten Programmiersprache erstellt werden. Beachten Sie jedoch, dass die Verwendung von Java für eine Callback-Routine einen übermäßigen TCB-Wechsel zwischen der Java- und der Nicht-Java-Umgebung verursacht, was die Leistung beeinträchtigt.
- Erstellen und verknüpfen Sie Ihre Callback-Routine mit der Option RENT und den Optionen AMODE(31), RMODE(ANY).
- Programmieren Sie Ihre Callback-Routine nach threadsicheren Standards und definieren Sie sie in CICS mit den Attributen CONCURRENCY(THREADSAFE) und API(CICSAPI), um die Anzahl der TCB-Wechsel zu optimieren. Die Verwendung von API(OPENAPI) würde die Leistung beeinträchtigen, da bei aktivem Speicherschutz für eine Callback-Routine übermäßig viele TCB-Wechsel auftreten.
Ein mit CONCURRENCY(REQUIRED) und API(CICSAPI) definiertes Programm ermöglicht es einem nach Threadsafe-Standards codierten Programm, ab dem Programmstart auf einer offenen TCB ausgeführt zu werden. Unabhängig vom Ausführungsschlüssel wird ein offener TCB L8 verwendet.
- Definieren Sie Ihre Rückrufroutine als lokales Programm, nicht als entferntes oder dynamisches. Remote- und dynamische Programme werden nicht als Callback-Routinen unterstützt, da die Datenstrukturen, die CICS in den Containern übergibt, Zeiger auf lokalen Speicher in einer Region enthalten. Der Versuch, eine Rückrufroutine zu registrieren, die als remote definiert ist, schlägt mit dem Ursachencode MQRC_MODULE_NOT_FOUND fehl.
CICS für Rückrufroutinen
| Containername | Inhalt |
|---|---|
| MsgDesc | MQMD2 Nachrichtenbeschreibung, Version 2 |
| GetMsgOpts | MQGMO – Nachrichtenoptionen abrufen |
| Puffer | Die Botschaft. Die in MQGMO angegebenen Optionen, wie z. B. Trunkierung und Konvertierung, haben auf die Nachricht dieselben Auswirkungen wie bei einem MQGET-Aufruf. |
| Kontext | MQCBC - Rückruf Kontext Version 2 |
Wenn Ihre Rückrufroutine Daten aus den Nachrichtendatenbehältern abruft, verwenden Sie GET CONTAINER SET-Befehle anstelle von GET CONTAINER INTO-Befehlen, um zukünftige Änderungen der Größe der Datenstrukturen zu ermöglichen. Kodieren Sie das Schlüsselwort "FLENGTH" und testen Sie, ob sein Wert Null ist, um zu prüfen, ob Behälter leer sind. Beispielsweise sind bei Ereignisaufrufen von Callback-Routinen die Container MsgDesc,, GetMsgOpts, und Buffer leer.
Verarbeitung von Synchronisierungspunkten, Abenden und Quiesce in Callback-Routinen
Um sicherzustellen, dass Ihre Callback-Routine ordnungsgemäß mit dem CICS - MQ Adapter interagiert, stellen Sie sicher, dass die folgenden Anforderungen erfüllt sind:
- Verwenden Sie CICS und CICS nur in Callback-Routinen für Nachrichtenverbraucher, wenn diese für eine Nachricht gestartet werden. Verwenden Sie diese Befehle nicht in Event-Handlern oder wenn Callback-Routinen zum Registrieren, Abmelden, Starten oder Stoppen aufgerufen werden.
- Wenn Sie CICS in einer Callback-Routine verwenden, schlägt der Befehl MQCTL mit dem Ursachencode MQRC_CALLBACK_ERROR(2452) fehl, da der Abend verarbeitet und die Steuerung an den Aufrufer zurückgegeben wird. Ein Abend in einer Rückrufroutine stoppt den Aufruf aller Rückrufroutinen, die von CICS verwaltet werden, die die MQCTL-Anfrage ausgegeben hat.
- Geben Sie in einer Event-Handler-Callback-Routine einen MQCTL-STOP-Befehl aus, wenn der Warteschlangenmanager oder die Verbindung in den Ruhezustand versetzt wird, um die erfolgreiche Stilllegung der CICS - MQ Schnittstelle zu ermöglichen. Wenn Sie diesen Befehl nicht ausgeben, kann die CICS - MQ Schnittstelle aufgrund des aktiven Ereignishandlers nicht in den Ruhezustand versetzt werden und die CICS - MQ -Schnittstelle muss zwangsweise geschlossen werden.
- Wenn Sie MQCB verwenden, um eine Rückrufroutine zu registrieren:
- Legen Sie im Parameter CallBackDesc (MQCBD) im Feld „Optionen“ nicht MQCBDO_FAIL_IF_QUIESCING fest. CICS muss im Rahmen seiner Verarbeitung MQCB-Befehle ausgeben, um den Eingang neuer Arbeit zu stoppen.
- Setzen Sie im GetMsgOpts (MQGMO) im Feld "Optionen" den Wert MQGMO_FAIL_IF_QUIESCING, um sicherzustellen, dass die Callback-Routine ordnungsgemäß beendet wird. Wenn Sie diese Stilllegungsoptionen nicht richtig festlegen, kann die CICS - MQ Schnittstelle aufgrund des aktiven Ereignishandlers nicht stillgelegt werden, und die CICS - MQ -Schnittstelle muss zwangsweise geschlossen werden.
- Wenn Sie CallBackDesc CallbackArea verwenden möchten, um einen Speicherbereich an die Callback-Routine zu übergeben, setzen Sie es auf die Adresse des Speichers, der mit CICS abgerufen wurde, und nicht auf den dynamischen Speicher des Programms. Die Callback-Routine greift über CallbackArea in der Callback-Kontextstruktur MQCBC auf diesen Speicher zu. Außerdem sollten Sie nach Beendigung des Programms den Speicher oder weitere davon abhängige Speicherbereiche nicht freigeben, sondern CICS den Speicher am Ende der Aufgabe freigeben lassen. Dadurch kann der Speicher verfügbar sein, wenn CICS die Callback-Routine aufruft, um sich am Ende der Aufgabenverarbeitung abzumelden.
- Wenn Sie MQCTL verwenden, um Aufrufe von Callback-Routinen zu steuern, und im ControlOpts ConnectionArea verwenden möchten, um einen Speicherbereich zu übergeben, der von allen Callback-Routinen gemeinsam genutzt werden soll, setzen Sie es auf die Adresse des Speichers, der mit CICS abgerufen wurde, und nicht auf den dynamischen Speicher des Programms. Callback-Routinen greifen über ConnectionArea in der Callback-Kontextstruktur MQCBC auf diesen Speicher zu. Außerdem sollten Sie nach Beendigung des Programms den Speicher oder weitere davon abhängige Speicherbereiche nicht freigeben, sondern CICS den Speicher am Ende der Aufgabe freigeben lassen. Dadurch kann der Speicher verfügbar sein, wenn CICS die Rückrufroutinen aufruft, um sich am Ende der Aufgabenverarbeitung abzumelden.