PDA

View Full Version : MONMSG für *INFO Nachrichten, oder anders...



AndreasW aus H
16-04-03, 16:27
Hallo *ALL!

Ich habe folgendes Problem und würde mich freuen einen Denkanstoß zu bekommen:

In einem CL wird per CPYFRMSTMF eine Datenstromdatei (DFÜ-Eingang im root-Verzeichnis) in eine DB-Datei (programmbeschrieben) gefüllt.

Wenn der Befehl funktioniert, aber Datensätze abgeschnitten wurden, wird eine *INFO-Nachricht (CPIA083) ausgegeben. Aufgrund dieser Nachricht sollen Aktionen durchgeführt werden.

Die Nachricht lässt sich aber, da es eine *INFO-Nachricht ist, nicht durch MONMSG abfangen. (*INFO und *DIAG-Nachrichten können nicht via MONMSG verarbeitet werden, oder gibt es da doch etwas?)
Auch ein hochsetzen der Fehlerbewertungsstufe in einer Kopie der QCPFMSG bringt nichts, dann wird halt eine 40er *INFO Nachricht versendet, die sich nicht monitoren lässt.

Gibt es vielleicht eine Möglichkeit, dem Befehl zu "sagen", dass er die Nachricht nicht als *INFO sondern als *NOTIFY versendet?

Oder ein API statt CPYFRMSTMF, welches entsprechende Informationen bietet beim Abschneiden? (ich habe nur QHFxxx-APIs gefunden, die nur in QDLS und QOPT funktionieren)

Lösbar ist das ganze mit RCVMSG * *PGMQ *INFO, der die *PGMQ des aktuellen Call Stack Entries ausliest. So könnte man alle Nachrichten des aktuellen Aufrufs des Programms auslesen und wenn CPIA083 dabei ist, reagieren. Das ist hier in der Firma aber nicht gewünscht.

Ich dürfte, wenn es denn ginge, den CL-Befehl über System(Befehl) oder QCMDEXC aus einem RPG herraus ausführen und anschließend über ein API die *PGMQ auslesen. Aber der Aufruf bekommt anscheinend einen neuen Call-Stack-Entry und dieser ist ja nach Beendigung des QCMDEXC wieder verschwunden, also kann ich wohl nicht die *PGMQ des aktuellen Call-Stack-Entries auslesen und auch nicht die *PGMQ des Call-Stack-Entries, in der QCMDEXC lief, oder?

Im JobLog lesen ist hier auch nicht erwünscht...

Ich wäre über jede Anregung sehr dankbar!

Ansonsten wünsche ich allen AS400/iSeries-Kollegen ein frohes Osterfest!

Andreas

B.Hauser
16-04-03, 17:37
Hallo,

hast Du Dir eigentlich schon mal das API QMHRCVPM (Receive Program Message) angeschaut?

Ich denke mit diesem API hast Du weitaus mehr Möglichkeiten als mit RCVMSG und Du kannst es direkt in deinem RPG-Programm aufrufen.

Birgitta

Riker
17-04-03, 15:47
Wenn du ein ILE-Programm verwendest, muss das RCV-Programm (CL) auch ILE mit der ActivationGroup *CALLER [CRTBNDCL ... ACTGRP(*CALLER)] sein (oder das Programm als Modul mit einbinden).
Der RCVMSG muss sich auch immer auf PGMQ(*PRV) beziehen. Um alle Nachrichten auszulesen, mußt du dir den MSGKEY merken und damit dann die vorherige oder nachfolgende Antwort auslesen, bis dein CPA-Nachricht kommt.

Fuerchau
23-04-03, 14:59
QCMDEXC leitet alle Nachrichten an seinen Stack an das aufrufende Programm weiter, so dass mittels QMHRCVPM die Nachrichten des eigenen Stacks gelesen werden können.

Das Problem ist hier nur, den richtigen Aufsetzpunkt zu finden. Wenn du nämlich ein QCMDEXC mehrmals ausgeführt hast, must du dir den MSGKEY der letzten gelesenen Nachricht merken und mit diesem wieder aufsetzen, da du sonst vorherige Nachrichten verarbeitest, die mit dem gerade aufgerufenen nichts mehr zu tun haben.

Ich würde die ganze Arbeit des QCMDEXC in ein CLP verlegen, dem man als Parameter die Pfade und einen Fehlercode übergibt.
Das CLP kann dann den CPYFRMSTMF ausführen und mittels RCVMSG und MONMSG diverse Fehlercodes zurückgeben.
So hat dann auch jeder Aufruf wieder seine eigene PGMQ, so dass auch tatsächlich nur Meldungen dieses Aufrufes auftreten können.