PDA

View Full Version : JAVA



Seiten : [1] 2

kaym
24-04-02, 09:33
Hallo,
Ich möchte die Returncodes eines Java-Pgm's in einem Cobol-Programm/CL-Pgm auswerten z.Zt. wird das Java-Pgm per RUNJAVA in einem CL aufgerufen. Die große frage wie komme ich an den Returncode des Javaprogramms bzw. wie kann ich zwischen Cl u.o. Cobol Parameter mit Java Programmen austauschen.

kay

BenderD
24-04-02, 15:01
Hallo,

das sind eigentlich zwei Fragen.
Java, RUNJAVA und QSH CMD(java ...) bzw. STRQSH CMD(java ...) starten eine JVM und rufen darin eine main Methode einer Java class auf. Die JVM gibt eigentlich nix zurück, ausser einem return Code, der beim System.exit() durch einen Parameter gesetzt wird. An diesen Return Code sollte man im CL per RCVMSG drankommen, bzw bei was anderem als 0 (normal exit) sollte eine CPF MSG durchbraten, die man auch mit MONMSG fangen könnte. Eine echte Rückgabe erfolgt hier nicht, da main vom Typ void ist.
Zur Parameter Rückgabe sind normalerweise Aufrufe über JNI (Java native Interface) vorgesehen, die allerdings aus COBOL und RPG problematisch und aus CL nicht möglich sind, da hierfür ein Multithreaded Kontext erforderlich ist. Aus Java Sicht rate ich von sowas üblicherweise ab, da man sich hiermit meist mehr Probleme einfängt als löst.
Was hast Du denn konkret damit vor???

Dieter

kaym
24-04-02, 15:11
Erstmal danke für diese verständliche Antwort. Es soll aus einem Cobol-Pgm ein Java-Pgm aufgerufen werden, dieses Java-Pgm führt einige Datenbankupdates aus und gibt im Fehlerfall einen negativen Returncode zurück (das ist die Vorgabe, das Javaprogramm existiert bereits). Das Cobolprogramm (Dialog) soll diesen Ret-Code nun auswerten und eine entsprechende Fehlermeldung ausgeben. das ist eigentlich alles.

kay

BenderD
24-04-02, 15:31
Hallo Kay,

ein paar Fragen habe ich noch
1. welches Release habt ihr?
2. ist Performance wichtig (sprich wird das häufig aufgerufen)
3. Wie sieht das Java Programm aus, macht der das alles im main() oder in einer static Routine oder halt so richtig OO ?
Vielleicht wären auch die entsprechenden Code Snippets hilfreich.

Dieter

kaym
24-04-02, 15:41
Hallo Dieter,

Release V5R1
Performace ist nicht ganz so wichtig.

Tja das Java-Pgm ist/wird von einer externen Firma erstellt als Teil einer Internetanwendung und wir wollen die vorhandenen Routinen nutzen um in die entsprechen DB-Files zu schreiben. leider komm ich an das coding z.Zt nicht ran http://www.as400-forum.de/ubb/frown.gif deswegen kann ich über das Java-Pgm auch nichts sagen....

kay

BenderD
24-04-02, 18:46
Hallo,

ohne erweiterte Kooperation des Java Programmes ist da wenig zu holen; ich habe das gerade nochmal ausprobiert, aber die Rückgabe eines return codes mit System.exit() ist in den Wind geschossen. Zudem läuft der Java Aufruf nicht im interaktiven Programm und über die DTAQ wird eh nix zurück gegeben.

Dieter

PS: WerMachtDennSowas???

Sven Schneider
24-04-02, 21:05
Ab V5R1 gibt es in RPGIV einen neuen Datentyp 'O' = Object.
Hier kannst du eine Java Object definieren.

Bsp.



D Obj S O CLASS(*JAVA
D :'java.lang.Object')
D Str S O CLASS(*JAVA
D :'java.lang.String')
D Num S O CLASS(*JAVA
D :'java.math.BigDecimal')


Wenn du eine Methode (Procedure) eines Java-Objects definieren willlst sieht das folgendermaßen aus.



D objectEquals PR N EXTPROC(*JAVA
D : 'java.lang.Object'
D : 'equals')
C IF objectEquals (obj1 : obj2)
C ...
C ENDIF


..und noch etwas Code


D BigDecimal C 'java.math.BigDecimal'
D add PR O EXTPROC(*Java: BigDecimal: 'add')
D otherNum O CLASS(*Java: BigDecimal)
D CONST
D ConstNum PR O EXTPROC(*Java: BigDecimal: *CONSTRUCTOR)
D GetValue PR O EXTPROC(*Java: BigDecimal: 'toString')
D CLASS(*Java: 'java.lang.Stringv)
D getLongValue PR 20I 0 EXTPROC(*Java:'java.lang.Long':
'valueOf')
D STATIC
D string O CLASS(*Java:'java.lang.String')
D CONST
D Num1 S O CLASS(*Java:BigDecimal)
D Num2 S O CLASS(*Java:BigDecimal)
D Total S O CLASS(*Java:BigDecimal)
D longInteger S 20I 0
D*
C EVAL Num1 = ConstNum(225)
C EVAL Num2 = ConstNum(175)
C EVAL total = add(Num1: Num2)
C EVAL longInteger =
getLongValue (GetValue (total))


Sehr gut beschrieben ist das alles auch hier : http://publib.boulder.ibm.com/html/as400/v5r1/ic2929/books/c0925073.pdf
(Ab Seite 157)

Sven



[Dieser Beitrag wurde von Sven Schneider am 24. April 2002 editiert.]

torsten
25-04-02, 07:27
Hallo,
so gehts:

QSHELL aufrufen und das Programm ausführen;
nach Beendigung $? auslesen:
echo &?
jetzt müßte der returnCode angezeigt werden.

Wenn das funktioniert (und das sollte es eigentlich), einfach die STDOUT - Ausgabe umleiten, den ReturnCode rausparsen und
im CL entsprechend reagieren ...

Gruß

Torsten

torsten
25-04-02, 07:28
Hoppla,

es muß natürlich heißen

echo $?

Gruß

Torsten

horschma
25-04-02, 07:32
Hallo,
hier ein Link auf einen Beitrag in der iSeries Knowledgebase.
http://www-912.ibm.com/supporthome.nsf/document/10000051

Über das API QUSRJOBI kann der Exit-Code des letzten Programm-Aufrufs ermittelt werden.

Thomas