PDA

View Full Version : Selbst erstellte Java-Exceptions in RPG-Programm verarb. (RPG-Programm, Modul, Java)



MMeyer
14-03-07, 11:24
Hallo,

Ich habe folgendes Problem, und hoffe, das hier jemand Tipps hat.

Folgende Situation:

Ich habe ein RPG-Programm, das mit einer Message aufgerufen wird. Dies setzt ein CMDEXC ab, als Parameter RUNJVA auf eine Java-Klasse. Soweit so gut.

Das Java-Programm wirft je nach Grad der Wichtigkeit selbst erstellte Exceptions. Diese sollen verschieden behandelt werden, z.B. Weitermachen, erneut versuchen, Mail an Admin .. usw.

Das Problem ist, das der CMDEXC mit 0 oder 1 zurückliefert, also RUNJVA hat geklappt oder hat nicht geklappt (Nicht geklappt wenn ich eine Exception werfe). Auf eventuelle Exceptions des Java-Programms kann ich also nicht direkt reagieren, da ich nur 0 oder 1 bekomme, jedoch nicht die genaue Exception. Wie kann man das am geschicktesten lösen, das ich im Falle eines Fehlers das RPG-Programm dazu bewege, sich irgendwo die Exception herzuholen und zu verarbeiten. Ich denke da so an DB-File, MSGQ, DTAQ oder ähnliches.

Hat jemand da Tipps?

PS: Das CMDEXC ist in einem Modul, und darf nicht verändert werden.

Vielen Dank,

MMeyer

mk
14-03-07, 13:13
Hallo MMeyer,


wenn das Javaprogramm auf der i5 läuft und eine
Exception vorkommt, dann schreibt das System i.d.R. die Meldung in die Datei STDERR in der Bibliothek QTEMP.
Vielleicht gibt es auch die Datei STDOUT in der QTEMP.

Mit einem OVRDBF kann man die Dateien auch in eine
andere Bibliothek umlegen.

Also bei einem Fehler mal die Bibliothek QTEMP prüfen.

Evtl. das Javaprogramm so modifizieren das in einem
Fehlerfall einfach eine DTAARA oder ähnliches gefüllt wird.

Gruss
Michael

RobertPic
14-03-07, 22:42
Da ich Java-Aufrufe aus RPG (oder sonst einer 3GL-Sprache) vermeide, hier ein ungetesteter Ratschlag.

Normalerweise ist das 0 (bei Fehlerfreiheit) der Exitcode. Man könnte einzelne Exceptions im Javaprogramm abfrage und dann mit z.B. System.exit(10) usw. unterschiedliche Exitcodes je Fehler erzeugen.

Das setzt allerdings voraus, dass man das Javaprogramm anpassen kann.

Ob der Exitcode auch im RPG ankommt, habe ich, wie gesagt, auch noch nicht getestet.

BenderD
16-03-07, 08:43
Hallo,

sicherlich kann man auch das noch heilen (System.exit() kann die errno besetzen und an die kommt man per Einbindung einer C Funktion dran), aber das Design ist von Beginn an krumm und da sollte man ansetzen.
Der Aufruf eines main per QCMDEXC und das durchrattern einer Exception mit damit verbundenem abschmieren lassen der Java Runtime ist der absolut teuerste Weg eine Java Funktion zu nutzen. Da würde ich keine weitere Zeile Code dransetzen und das von Grund auf anders lösen.
- ein kleines Java Programm, das in einer Schleife an einer DTAQ wartet und per SBMJOB gestartet wird und dann bis zum PWRDWNSYS aktiv bleibt
- wenn das RPG Programm was von Java will, erstellt es einmal pro Job eine AntwortQ und stellt einen Eintrag in die Q des Java Programms mit den Anforderungsdaten und sagt dem Java Programm wohin die Antwort gehen soll, dann wartet es auf die Antowrt

Dieter Bender

PS: den stderr auszuwerten, oder was in eine DataArea zu schreiben, das würde ich bleiben lassen, das macht das Ganze noch morscher


Hallo,

Ich habe folgendes Problem, und hoffe, das hier jemand Tipps hat.

Folgende Situation:

Ich habe ein RPG-Programm, das mit einer Message aufgerufen wird. Dies setzt ein CMDEXC ab, als Parameter RUNJVA auf eine Java-Klasse. Soweit so gut.

Das Java-Programm wirft je nach Grad der Wichtigkeit selbst erstellte Exceptions. Diese sollen verschieden behandelt werden, z.B. Weitermachen, erneut versuchen, Mail an Admin .. usw.

Das Problem ist, das der CMDEXC mit 0 oder 1 zurückliefert, also RUNJVA hat geklappt oder hat nicht geklappt (Nicht geklappt wenn ich eine Exception werfe). Auf eventuelle Exceptions des Java-Programms kann ich also nicht direkt reagieren, da ich nur 0 oder 1 bekomme, jedoch nicht die genaue Exception. Wie kann man das am geschicktesten lösen, das ich im Falle eines Fehlers das RPG-Programm dazu bewege, sich irgendwo die Exception herzuholen und zu verarbeiten. Ich denke da so an DB-File, MSGQ, DTAQ oder ähnliches.

Hat jemand da Tipps?

PS: Das CMDEXC ist in einem Modul, und darf nicht verändert werden.

Vielen Dank,

MMeyer