PDA

View Full Version : ILE-RPG und Java



Sven Schneider
25-06-03, 17:24
Ich versuchs noch 'mal hier ... :confused:
Hallo,
das ist mein erster Versuch mit RPGIV und JNI.
Soweit funktioniert auch alles nur beim Ruf der Java-Methode "valueOf" der Klasse java.lang.String (getLongValue) bricht das Programm ab.

Wo ist der Fehler ?
Danke Sven !!!





D*------------------------------------------------------------------------
D* Declaration for Java object of class BigDecimal in package java.math
D*------------------------------------------------------------------------
Dj_BigDecimalObj S O CLASS(*JAVA: 'java.math.BigDecimal')

D*----------------------------------------------------
D* Parameter field declarations for Java constructor:
D* in class BigDecimal in package java.math
D*----------------------------------------------------

D*-----------------------------------------------
D* Returned field declaration for Java method:
D* multiply in class BigDecimal
D* Java returned type is java.math.BigDecimal
D*-----------------------------------------------
D j_multiplyRet S O CLASS(*JAVA : 'java.math.BigDecimal')
D*-----------------------------------------------
D* Parameter field declarations for Java method:

D* multiply in class BigDecimal
D*-----------------------------------------------
D* Parameter field declaration for Java type: java.math.BigDecimal
D j_multiplyParm1...
D S O CLASS(*JAVA : 'java.math.BigDecimal')

D*-----------------------------------------
D* Prototype for Java constructor in class
D* BigDecimal in package java.math
D*-----------------------------------------
D j_BigDecimalCtor...
D PR O EXTPROC(*JAVA :
D 'java.math.BigDecimal' :
D *CONSTRUCTOR)
D CLASS(*JAVA : 'java.math.BigDecimal'
D )
Dj_BigDecimalParm1...
D 8F Value
D*------------------------------------------------------
D* Prototype for Java method:
D* multiply in class BigDecimal in package java.math
D*------------------------------------------------------
D j_multiplyMethod...
D PR O EXTPROC(*JAVA :
D 'java.math.BigDecimal' : 'multiply')
D CLASS(*JAVA : 'java.math.BigDecimal'
D )
D* Parameter prototype declaration for Java type: java.math.BigDecimal
D parm1 O CLASS(*JAVA : 'java.math.BigDecimal')
D CONST
D getStringValue PR O EXTPROC(*Java:'java.math.BigDecimal':
D 'toString')
D CLASS(*Java: 'java.lang.String')
D getLongValue PR 20I 0 EXTPROC(*Java:'java.lang.Long':
D 'valueOf')
D STATIC
D string O CLASS(*Java:'java.lang.String')
D CONST
D longString S 65535A
D longInteger S 20I 0

D*-------------------------------------------------------------------------
D* Prototype for procedure containing sample code for calling Java method:
D* multiply in class BigDecimal in package java.math
D*-------------------------------------------------------------------------
D CallMultiplyMethod...
D PR
D*
C CALLP CallMultiplyMethod
C eval *inlr = *ON
P*-----------------------------------------------------------
P* Procedure containing sample code for calling Java method:
P* multiply in class BigDecimal in package java.math
P*-----------------------------------------------------------
P CallMultiplyMethod...
P B
D CallMultiplyMethod...
D PI
C*--------------------------------------------
C* Instantiate object of Java class BigDecimal
C*--------------------------------------------
C IF j_BigDecimalObj = *NULL
C EVAL j_BigDecimalObj = j_BigDecimalCtor(35)
C ENDIF
C IF j_multiplyParm1= *NULL
C EVAL j_multiplyParm1 = j_BigDecimalCtor(2)
C ENDIF
C*---------------------------------
C* Call Java method:
C* multiply in class BigDecimal
C*---------------------------------
C EVAL j_multiplyRet =
C j_multiplyMethod(j_BigDecimalObj :
C j_multiplyParm1)
C eval longInteger =
C getLongValue(getStringValue(j_multiplyRet))
P CallMultiplyMethod...
P E

BenderD
28-06-03, 11:10
Hallo,

ich kann aus dem Ärmel auch nicht sagen, warum das so nicht geht. Aber zu RPG und Java, insbesondere JNI sei doch folgendes angemerkt:

1. Java läuft nur Multithreaded (wg. garbage Collector)

2. RPG läuft nicht im Multithreaded Environment, jedenfals nicht problemlos. Die Compile Option Thread *serialize synchronisiert auf Module Ebene, was Deadlocks zur Folge haben kann und für Exporte von Variablen nicht hilft.

3. In jedem Job, der JNI verwendet, wird eine JVM gestartet, was für das Einbinden von Java Aufrufen in interaktive RPG Programme katastrophale Folgen hat.

4. Spätestens wenn man dann in dem java Programm wieder RPG per JNI aufruft, ist die Katastrophe vorprogrammiert, sowohl was Performance, als auch die Stabilität betrifft.

5. Das enge vernähen von so unterschiedlichen Technologien wie Java und RPG ist ein ernsthafter Design Mangel

Mein Resümee: bleiben lassen
entweder Java oder RPG!!!

Wenn man vorhandene (RPG) Funktionen denn wirklich in Java nutzen will oder muss, ist der einfachste Weg SQL Functions oder stored Procedures; aber bitte in der Anwendung sauber kapseln, damit man diesen Mix irgendwann mal los wird.
Wenn man bereits in Java entwickelt, gibt es keinen vernünftigen Grund parallel dazu weiter RPG zu schreiben, Spass macht das dann den meisten eh' nicht mehr.

Dieter Bender

BenderD
28-06-03, 11:40
Hallo,

Nachtrag:

getLongValue(getStringValue(j_multiplyRet)).valueO f()

sollte es tun.

Die Verwendung von

longValue der BigDecimal wäre allerdings besser. also:

longInteger = j_multiplyRet.longValue()

Dieter Bender

Sven Schneider
30-06-03, 17:21
Hallo Dieter Bender,

die ganzen Probleme mit JNI (Instanzierung JVM, Multithreading) sind mir bekannt. Auch das man sich um das Freigeben der Java-Objekte, gerade in interaktiven Sitzungen, kümmern muss ist bekannt. (Stichwort garbage collector)

Es ging auch nur um das konkrete Problem.
Das "Erzeugen" des String-Objekts mit getStringValue funktioniert ja auch noch, nur der Aufruf der statischen Methode valueOf aus 'java.lang.Long' schlägt fehl.
Und hier würde mich schon der Grund interessieren.

also mit



D getlongValue PR 20I 0 EXTPROC(*Java:'java.math.BigDecimal':'longValue')

und


C eval longInteger = getLongValue(j_multiplyRet)

funktioniert es tadelos.

Sven

BenderD
30-06-03, 21:53
Hallo,

so bekannt scheint die Problematik doch nicht zu sein, sonst würde mancher die Finger von sowas lassen. Im übrigen stimmt das mit dem garbage collector nur für das Zeug, auf das das RPG Programm Referenzen hält.

Long.valueOf(String) ist vom Typ Long, was nicht dasselbe wie der elementare Typ long ist, sondern ein echtes Object, mit dem RPG nix anfangen kann.

getLongValue von BigDecimal ist vom erforderlichen Typ long.

Dieter Bender

Sven Schneider
01-07-03, 15:52
Danke Dieter,
das wars.
Da ich auch noch Java-Neuling bin, war mir nicht bekannt, daß ein Unterschied zwischen dem primitiven Datentyp long und der Klasse java.lang.Long besteht.

Da ich das (angepasste) Bsp. von der Seite der NEWS/400 (November 2000) hatte, dürfte damit dies ebenso falsch sein.

Siehe :
http://www.iseriesnetwork.com/ArtArchiveImages/figure.cfm?Figure=2000/November/8642-Fig6.htm

Nochmals Danke !!!
Sven