-
ILE-RPG und Java
Ich versuchs noch 'mal hier ...
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 !!!
Code:
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
-
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
-
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
-
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
Code:
D getlongValue PR 20I 0 EXTPROC(*Java:'java.math.BigDecimal':'longValue')
und
Code:
C eval longInteger = getLongValue(j_multiplyRet)
funktioniert es tadelos.
Sven
-
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
-
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/ArtArc.../8642-Fig6.htm
Nochmals Danke !!!
Sven
Similar Threads
-
By homue in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 18-07-07, 16:47
-
By Stoeberl in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 10-01-07, 10:58
-
By Squall in forum IBM i Hauptforum
Antworten: 31
Letzter Beitrag: 28-09-06, 17:53
-
By PGMR in forum NEWSboard Java
Antworten: 10
Letzter Beitrag: 10-02-05, 10:33
-
By PGMR in forum NEWSboard Programmierung
Antworten: 0
Letzter Beitrag: 02-02-05, 13:10
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks