Von der Infrastruktur gesetzte Conditions

In der TAA-Infrastruktur im LAN wurden mit V7.01 alle Oopse des Objekt-Managers, ausgenommen in rein internen Funktionen, auf Conditions umgestellt.

Die Conditions, die von der Infrastruktur gesetzt werden, stammen alle aus Meldungsgruppen, die der Meldungsklasse TAAIM zugeordnet sind. Für Conditions aus dieser Meldungsklasse wird in der Infrastruktur ein Class-Handler installiert, sodass diese Conditions nie in den anwendungsseitig installierten Condition-Handlern ankommen. Außerdem werden diese Conditions nicht direkt geraised, sondern lediglich markiert als „MarkedForRaise“; der Raise erfolgt aus dem Anwendungsmodul heraus, sodass die für die Condition gesetzte Aktion auch ausgeführt werden kann (z.B. ExitModl, ExitArbg).

Behandlung von markierten Conditions in der Anwendung

Die Einführung von „markierten Conditions“ löst die Problematik, dass der Aktionscode einer von der Infrastruktur selbst aufgeworfenen Condition im Anwendungsmodul nicht zur Verfügung steht, und somit die Reaktion auf eine solche Condition nicht oder nur verzögert (durch Setzen des WflState) möglich ist.

Das Markieren von Conditions ist ausschließlich in der Infrastruktur möglich.

„MarkedForRaise“ bedeutet, dass diese Condition so bald wie möglich geraised werden soll, jedoch führt die Infrastruktur den Raise nicht selbst aus, sondern er muss aus einem Anwendungsmodul heraus veranlasst werden, um zu erreichen, dass das Ergebnis des Raise im Anwendungsmodul abgefragt werden kann.

Bei einem von der Anwendung ausgeführten Raise einer Condition kann diese Condition auch eine markierte sein, sodass bei vollständiger Abarbeitung der Condition-Collection automatisch auch die markierten Conditions behandelt werden. Auch beim SHOW-ALL werden die markierten Conditions mit angezeigt.

In COBOL-Modulen, die mit einem Generatorstand ab V7.04 generiert werden, sorgt der TAA-COBOL-Generator dafür, dass nach Infrastrukturaufrufen, die möglicherweise markierte Conditions zur Folge haben, diese geraised werden. Auch in Steuerungsmodulen und CTV-Modulen wird an mehreren Stellen Zz.B. nach Modulaufrufen) das Vorhandensein markierter Conditions geprüft und diese ggf. geraised.

In C, VB, .net und sonstigen Modulen werden diese Conditions erst geraised, wenn das entsprechende Coding vom Anwendungsprogrammierer eingefügt wurde. Das kann in einer Übergangsphase zur Folge haben, dass markierte Conditions, die während der Ausführung solcher Module anfallen, erst geraised werden, wenn ein COBOL- CTV- oder Steuerungsmodul aktiv wird.

Von der Infrastruktur gesetzte und markierte Conditions verwenden Meldungsgruppen, die der Meldungsklasse TAAIM zugeordnet sind (z.Zt. die Gruppen ZZTAAOM1 und ZZTAAIM2). Für diese Meldungsklasse ist in der TAA-Infrastruktur ein eigener Condition-Handler installiert. Dadurch wird vermieden, dass diese Conditions in den Conditionhandlern der Anwendung behandelt werden müssen.

CndRaiseMarked API

C / C++

HTAACND taaCndRaiseMarked(hStme) taaCndRaiseMarked führt den Raise für die erste markierte Condition direkt aus, entspricht also einem
taaCndRaise(taaCndMarkedforRaiseGet());

HTAACND taaCndMarkedforRaiseNext(VOID) taaCndMarkedforRaiseGet liefert die erste markierte Condition. Sobald diese Condition geraised wird, wird sie aus der Collection der markierten Conditions entfernt, sodass der folgende Zugriff über taaCndMarkedforRaiseGet die folgende Condition liefert. Der so beschaffte Condition Handle kann taaCndRaise oder anderen Conditionhandling-Funktionen übergeben werden.

HTAACND taaCndMarkedforRaiseNext(VOID) taaCndMarkedforRaiseNext wird nur benötigt, um die Liste der markierten Conditions abzuarbeiten, ohne diese dabei aufzuwerfen oder zu entfernen.

DWORD taaCndMarkedForRaiseCount(VOID) taacndMarkedForRaiseCount liefert die Information, ob bzw. wieviele markierte Conditions vorhanden sind

COM (VB)

<ModlEnv>.cndRaiseMarked() as Long
<ModlEnv>.cndMarkedForRaiseCount() As Long

cndRaiseMarked führt den Raise für die erste markierte Condition aus.

Der Code, um für markierte Conditions einen Raise auszuführen, könnte somit lauten:

For i = Me.cndMarkedForRaiseCount To 1 Step -1
   Me.cndAction = Me.cndRaiseMarked
   If Me.cndAction >= taaCndActResume Then
      Exit For
   End If
Next i

Nach Modulaufrufen in VB wird dieser Code seitens der Infrastruktur bereits ausgeführt, sodass nur noch die Abfrage von cndAction im Anwendungsprogramm erforderlich ist.

C#

TAAConditions ^ModlEnv::cndMarkedForRaise::get() liefert eine Collection aller zur Zeit markierten Conditions. TAAConditionAction ModlEnv::cndRaiseMarked() führt den Raise für die erste markierte Condition direkt aus;

Der Code, um markierte Conditions einen Raise auszuführen, könnte somit lauten:

   while (cndAction == TAAConditionAction::Resume && cndMarkedForRaise->Count != 0)
      cndAction = cndRaiseMarked();

Nach Modulaufrufen in C# (in .net-Modulen) wird dieser Code seitens der Infrastruktur bereits ausgeführt, sodass dies im Anwendungsprogramm nicht mehr erforderlich ist.

COBOL

In COBOL sind keine Anpassungen im Source notwendig, um die Behandlung der markierten Conditions zu erreichen, sondern lediglich eine Neu-Generierung.

Dabei wird nach bestimmten Anweisungen ein Perform auf auf eine Section generiert, die die markierten Conditions aufwirft. Diese Section ruft – in einer Schleife über alle zum Raise markierten Conditions – die Infrastruktur auf, damit diese die markierten Conditions in der Reihenfolge ihres Auftretens aufwirft. Die Infrastruktur aktiviert beim Raise den dafür installierten Proc-Handler und liefert das Ergebnis zurück.

Die Anweisungen, nach denen der Perform erzeugt wird, sind:

  • alle OM-Operationen (PUT, GET usw, Ausnahme: INITIALIZE)
  • REGISTER (sofern dort OM-Operationen ausgeführt wurden, einmalig im Anschluss daran)
  • CALL (einmalig jeweils nach den OM-Operationen vor und nach dem Modulaufruf, sofern vorhanden)
  • START (einmalig nach den OM-Operationen vor dem Modulstart)
  • SAVE/RESTORE (einmalig am Ende des für die Operation generierten Codes)

Über den neuen Returncode IM-RC-CND-SET kann zusätzlich abgefragt werden, ob während der Ausführung des letzten EXEC-TAA-Befehls Conditions gesetzt wurden.

Beispiel für den generierten Code

TAA   *       EXEC TAA REGISTER END-EXEC.
TAA        PERFORM TX-P-REGISTER.
           exec taa on severe exit module end-exec.
           exec taa on log resume next.
           exec taa on warning perform my-check-om end-exec.
           exec taa on error perform my-cnd-handler end-exec.
TAA   *        exec taa put ptest end-exec
TAA        MOVE 'PTEST' TO TX-SRC-NAME
TAA        MOVE TX-PTEST-HANDLE TO TX-SRC-HANDLE
TAA        MOVE 'PUT' TO TX-OM-CODE
TAA        MOVE 'OM' TO TX-CODE
TAA        MOVE LENGTH OF PTEST-REC TO TX-SRC-LENGTH
TAA        SET TX-SRC-POINTER TO ADDRESS OF PTEST-REC
TAA        MOVE 'NON' TO TX-SRC-POS-TYPE
TAA        CALL TAAIM USING TX-TAA
TAA        PERFORM TX-RAISE-MARKED
 ......

TAA     TX-RAISE-MARKED SECTION.
TAA         IF TX-CND-MARKEDFORRAISECOUNT = 0
TAA         EXIT SECTION
TAA         END-IF
TAA         MOVE 'ERR-EXPR' TO TX-CODE
TAA         CALL TAAIM USING TX-TAA
TAA         PERFORM UNTIL TX-CND-HANDLE-P = NULL
TAA             PERFORM TX-ERROR
TAA             MOVE 25 TO TX-CNDEXPR-CODE
TAA             MOVE 'ERR-EXPR' TO TX-CODE
TAA             CALL TAAIM USING TX-TAA
TAA         END-PERFORM
TAA         EXIT.
         ......

TAA    TX-ERROR SECTION.
TAA        MOVE 0 TO TX-ENM-WFLSTATE
TAA        IF TC-CND-ACTION-CALLERHDL
TAA        PERFORM TX-P-UNREGISTER
TAA        GO TO TX-P-GOBACK
TAA        END-IF
TAA        IF TX-CND-ACTION-ID
TAA        EVALUATE TX-CND-HDL-ID
TAA        WHEN 1
TAA        SET TC-CND-ACTION-EXITMODL TO TRUE
TAA        WHEN 2
TAA        SET TC-CND-ACTION-RESUME TO TRUE
TAA        WHEN 3
TAA        PERFORM my-check-om
TAA        WHEN 4
TAA        PERFORM my-cnd-handler
TAA        END-EVALUATE
TAA        END-IF
TAA        EVALUATE TRUE
TAA        WHEN TC-CND-ACTION-CALLERHDL............

.........

........

TAA        EXIT.

Markierte Conditions

Die von der Infrastruktur gesetzten Conditions haben i.d.R. die Severities Severe oder Warning. Der Klassenhandler für TAAIM reagiert im Falle von Severe mit EXIT-ARBG, sonst mit RESUME. Alle Conditions, die von der Infrastruktur gesetzt und markiert werden, sind der Klasse TAAIM zugeordnet.

Verhalten ohne markierte Conditions mit markierten Conditions Unterschied
Die Condition wurde sofort bei Auftreten des Fehlers geraised. Im Falle von Severe wurde der Workflow-State auf ERROR gesetzt. Die Condition wird bei ihrem Entstehen markiert. An festgelegten Stellen in Steuerungs- und CTV-Modulen (z.B. nach Modulaufrufen) werden markierte Conditions geraised. Wenn das Ergebnis eines solchen Raise EXIT-Arbg ist, wird die Ausführung des Moduls beendet. In einem Fall erfolgt die Unterbrechung indirekt durch das Setzen des Wflstate, im anderen Fall direkt als Reaktion beim Raise.
Exit-Arbg erfolgt an der nächsten Stelle, wo der WflState abgefragt wird, spätestens also bei Rückkehr in eine Steuerung oder ein COBOL-Modul. Exit-Arbg erfolgt an der nächsten Stelle, wo ein Raise-Marked erfolgt, spätestens also bei Rückkehr in Steuerung, CTV-Modul oder neu generiertes COBOL-Modul. Der Zeitpunkt, zu dem der Exit-Arbg wirksam wird, kann etwas früher liegen, da markierte Conditions öfter abgefragt werden als der WflState.

Generierte COBOL-Module behandeln auch markierte Conditions, die z.B. in aufgerufenen Modulen verursacht und nicht geraised wurden.

In Modulen, die - wie bis 7.03 üblich - eine eigene Fehlerbehandlung für den Fall OM-RC-NOT-OK durchführen, wird diese eigene Fehlerroutine i.d.R. nicht mehr zum Zuge kommen, weil bei einem NOT-OK zumeist eine Condition mit Severity Severe gesetzt wurde. Der generierte Raise der markierten Conditions erfolgt vor der Fortsetzung des anwendungsseitig programmierten Codes. Die Fehlerroutine wird, wenn überhaupt, dann nur mit solchen Fehlern ausgeführt werden, die nicht bereits über eine markierte Condition abgewickelt wurden.

faq:allg:imcnds · Zuletzt geändert: 21.06.2023 11:40

Copyright © 1992-2024 TeamWiSE Gesellschaft für Softwaretechnik mbH         Adressen |  Kontakt |  AGB |  Datenschutzerklärung |  Impressum