PDA

View Full Version : Job darf nicht mit anderem laufen



Seiten : [1] 2

dibe
14-07-11, 14:57
Guten Tag allerseits,
wir haben hier 2 jobs die nicht gleichzeitig laufen dürfen.

job-a wird interaktiv und im batch gerufen, darf nicht mit Job-b zusammen laufen, darf aber mit anderen Job-a Jobs laufen.

Job-b läuft auch interaktiv und im batch, darf nie mit job-a aber auch nie mit anderen Job-b's laufen.

Wie kann ich das Bewerkstelligen ohne eine komplexe Verwaltung zu programmieren. (beide jobs können auch von außen 'unschön' beendet werden.

ach so, da der interaktive Lauf ja irgendwann beendet ist, muß eigendlich nicht auf Job sondern auf aktives Programm geprüft werden!
Danke
Dietlinde Beck

KingofKning
14-07-11, 15:07
Tja die übliche Lösung ist ein Unterprogramm welches testet ob z.B. eine eine dtaara gefüllt ist und dann sagt du darfst laufen oder nicht.

Sprich am Anfang der Programms testen ob dtaara gefüllt, wenn nicht dann füllen und am Ende wieder leeren. Ist nicht wirklich aufwendig.

GG

Fuerchau
14-07-11, 15:10
Wenn der Job aber abnormal gekillt wird, hat die DTAARA den falschen Inhalt.

Einfacher ist da ein ALCOBJ, der ein jobspezifisches Objekt sperrt, nach Jobende (egal wie) wird die Sperre aufgehoben.

Im Dialog macht dann ein DLCOBJ auch noch Sinn.

KingofKning
14-07-11, 15:25
Wenn der Job aber abnormal gekillt wird, hat die DTAARA den falschen Inhalt.


Das ist wohl war, aber ab und zu dürfen die Leute ja auch wissen was sie tun. Und wenn ich den Job kille, sollte ich auch aufräumen. Aber viele Wege führen nach Rom.
Wobei, ich kenne auch ein Rom im Bergischen Land.......

GG

dibe
14-07-11, 16:12
Hallo
das mit aloc versteh ich nicht.
wenn job-a den aloc setzt, kann job-a doch kein 2. mal laufen
oder ?

Leider werden diese jobs gekillt ohne aufzuräumen.
Das ist eine vorrangsautomatik die sehr komplex ist. Und bisher auch problemlos.

DiBe

Pikachu
14-07-11, 16:25
Am besten ein ALCOBJ und abschließendes DLCOBJ in beiden Programmen auf das selbe Objekt (zum Beispiel einen Datenbereich), im Programm A mit Sperre *SHRRD und in Programm B mit Sperre *EXCL. Dann darf Programm A mehrmals gleichzeitig laufen, Programm B aber immer nur alleine.

PGM
ALCOBJ OBJ((Objekt *DTAARA *SHRRD)) WAIT(0)
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ENDPGM))
...
DLCOBJ OBJ((Objekt *DTAARA *SHRRD))
ENDPGM: ENDPGM

PGM
ALCOBJ OBJ((Objekt *DTAARA *EXCL)) WAIT(0)
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ENDPGM))
...
DLCOBJ OBJ((Objekt *DTAARA *EXCL))
ENDPGM: ENDPGM

Fuerchau
14-07-11, 16:27
Ja stimmt, du hast Recht. Ein ALCOBJ hilft da nicht.
Da ja der Job selber durchaus mehrmals laufen darf.
Die Killproblematik ist da natürlich nicht zu verachten.

Es bleibt dir nur die DTAARA-Variante als Zähler:

JOBADTA
JOBBDTA

Job-A prüft, ob JOBBDTA > 0
Wenn ja -> Warten oder Ende ?
Wenn Nein -> JOBADTA += 1, Arbeiten und -= 1

Job-B macht das dann genauso.
Du musst dir halt nur noch überlegen, in welchem Job du die DTAARA's wieder auf 0 zurücksetzt.

Die Frage ist ja noch, wie der Job denn gekillt wird.
Bei *IMMED hast du ja keine Chance, aber bei *CNTRLD könnte der aktive Job ja den Endestatus in seiner Schleife per RTVJOBA ENDSTS(&STS) abfragen und dann selber aufräumen.
Oder rennt der Job eh nur einmal durch ?

dibe
15-07-11, 07:59
Hallo Picachu,
das hört sich gut an. Unsere Programmierer habe gesagt, das sie sich noch nie mit den Sperrstufen befasst haben. Wenn Sperre dann *excl. Wir werden das probieren, vielen Dank

Herr Fuerchau
ich weis nicht genau, wie sich diese Jobs abmelden. ich weis nur, das es in der vergangenheit IMMER völlig problemlos lief. Diese Sperr Situation ist neu. Wir werden den Vorschlag von Picachu an einem 'Pärchen' ausprobieren

Vielen Dank

Dietlinde Beck

holgerscherer
15-07-11, 08:28
Hallo Picachu,
das hört sich gut an. Unsere Programmierer habe gesagt, das sie sich noch nie mit den Sperrstufen befasst haben. Wenn Sperre dann *excl. Wir werden das probieren, vielen Dank


Hallo Dietlinde,
zumindest hört es sich so an, als wäre Job-B der Kandidate für eine Exklusive Sperre. Die muss dieser immer prüfen, und dann setzen. Job-A muss diese Sperre auch prüfen. Aber letztlich ist es auch eine Frage des Designs. Geht es um eine Tabelle, die tot umfällt, wenn mehrere Jobs darauf zugreifen?

-h

cbe
15-07-11, 10:08
Hallo Dietlinde,

wie wäre es mit folgender Variante:

Job-A macht immer beim Aufruf:
ALCOBJ OBJ((D1 *DTAARA *SHRRD)) WAIT(0)
Wenn es nicht geht, dann Ende.


Job-B macht immer beim Aufruf:
ALCOBJ OBJ((D1 *DTAARA *EXCL)) WAIT(0)
Wenn es nicht geht, dann Ende.

Job-A kann dann immer laufen, solange kein Job-B läuft,
und Job-B kann dann immer laufen, solange kein Job-A und kein anderer Job-B läuft.

Am Ende der Arbeit sollte jeweils noch ein DLCOBJ stehen, damit bei interaktivem Aufruf die Sperre wieder gelöst wird.
Nach Abbruch des Jobs egal aus welchem Grund ist die Sperre von selbst wieder weg.

Das ist es doch, was Du wolltest, oder?

D1 ist irgendein Objekt, ich nehme am liebsten DTAARAs mit sprechendem Namen.

Gruß, Christian