Ein Memorandum zum Aufrufen von Java-Methoden aus ILE RPG. Es wird auch im "IBM Rational Development Studio für i ILE RPG-Programmierhandbuch" (IBM i Version 7.2) beschrieben, aber es wurde nicht sehr detailliert geschrieben, also habe ich es tatsächlich versucht.
Die ausgeführte Umgebung von IBM i ist Version: V5R4, Java: 1.4.2. (Es funktionierte auch unter V7R2 und Java 1.8.0.)
Um es ein wenig praktischer zu machen, habe ich ein Programm erstellt, das den Status laufender Jobs zurückgibt. Übergeben Sie eine Zeichenfolge (Jobname) als Argument und geben Sie die Zeichenfolge (Status) zurück. (Wenn derselbe Jobname mehrmals existiert, wird der Status des ersten erworbenen Jobs zurückgegeben.)
Es ist in Ordnung, wenn der folgende Befehl die Java-Version zurückgibt.
CHGJOB CCSID(5035)
STRQSH
java -version
Die Ordnerstruktur von IFS unter IBM i lautet wie folgt.
/Root
|-JavaApps
|-/bin
|-/mypackage
|-As400Funcs.class
|-/lib
|-jt400.jar
|-/src
|-/mypackage
|-As400Funcs.java
As400Funcs.java
package mypackage;
import com.ibm.as400.access.AS400;
import com.ibm.as400.resource.RJob;
import com.ibm.as400.resource.RJobList;
import com.ibm.as400.resource.ResourceException;
public class As400Funcs {
public static void main(String[] args) {
System.out.println(GetJobSts("DSP01"));
}
public static String GetJobSts(String searchJob) {
AS400 as400 = new AS400("192.168.XXX.XXX" ,"MYUSER" ,"MYPASS");
//init
String resultStatus = "NONE";
//get JobList
RJobList jobList = new RJobList(as400);
try {
jobList.setSelectionValue(RJobList.PRIMARY_JOB_STATUSES, new String[] { RJob.JOB_STATUS_ACTIVE });
jobList.setSelectionValue(RJobList.JOB_NAME,searchJob);
jobList.open();
jobList.waitForComplete();
//Get First Job
long numberOfJobs = jobList.getListLength();
for (long i = 0; i<numberOfJobs; ++i){
RJob ajob = (RJob)jobList.resourceAt(i);
RJob rjob = new RJob(as400,searchJob,(String)ajob.getAttributeValue(RJob.USER_NAME),(String)ajob.getAttributeValue(RJob.JOB_NUMBER));
resultStatus = (String)rjob.getAttributeValue(RJob.ACTIVE_JOB_STATUS);
System.out.println("JOB Status:"+resultStatus);
System.out.println("JOB Name:"+searchJob);
break;
}
} catch (ResourceException e) {
e.printStackTrace();
}
return resultStatus;
}
}
Umgebungsvariablen festlegen. (Bitte melden Sie sich einmal ab, um sicherzugehen.)
ADDENVVAR ENVVAR(CLASSPATH) VALUE('/JavaApps/bin:/JavaApps/lib/jt400.jar')
Kompilieren und testen (QSHELL)
javac -d /JavaApps/bin /JavaApps/src/mypackage/As400Funcs.java
java mypackage/As400Funcs
Im Beispiel war der Jobname des Arguments "DSP01". Bitte geben Sie den Job an, der tatsächlich ausgeführt wird. Es ist in Ordnung, wenn Sie den Status korrekt erhalten können.
GETJOBSTSR.rpgle
*
*Beispielprogramm, das JAVA-Methoden aufruft
*
H DFTACTGRP(*NO)
D MAIN PR EXTPGM('GETJOBSTSR')
D 10A
D MAIN PI
D searchJob 10A
D newString PR O ExtProc(*JAVA:
D 'java.lang.String':
D *CONSTRUCTOR)
D Class(*JAVA:'java.lang.String')
D bytes 10A Const Varying
D GetJobSts PR O ExtProc(*JAVA:
D 'mypackage.As400Funcs'
D :'GetJobSts')
D STATIC
D CLASS(*JAVA:'java.lang.String') //Rückgabetyp
D string O CLASS(*JAVA:'java.lang.String') Const//Parameter
D getBytes PR 10A ExtProc(*JAVA:
D 'java.lang.String':
D 'getBytes')
D Varying
D string1 S O Class(*JAVA:'java.lang.String')
D StringResult S O Class(*JAVA:'java.lang.String')
D StringDisply S 10A Varying
/Free
String1 = newString(searchJob) ;
StringResult = GetJobSts(String1) ;
StringDisply = getBytes(StringResult) ;
dsply StringDisply;
*inLR = *on ;
return ;
/End-Free
CRTBNDRPG PGM(MYLIB/GETJOBSTSR) SRCFILE(MYLIB/MYSRC) DBGVIEW(*SOURCE)
CALL GETJOBSTSR PARM('DSP01')
Es ist in Ordnung, wenn der Auftragsstatus auf dem Bildschirm angezeigt wird.
java.lang.NoClassDefFoundError
In den meisten Fehlerfällen ist die Umgebungsvariable "CLASSPATH" falsch. Insbesondere sobald RPG ausgeführt wird, beginnt die JVM mit diesem Job und dann
ADDENVVAR ENVVAR(CLASSPATH) VALUE('/JavaApps/bin:/JavaApps/lib/jt400.jar')
** Wird nicht reflektiert ** auch wenn ausgeführt wird. (Es scheint, dass Sie die JVM nicht neu starten können. Sie müssen sich einmal abmelden.)
Recommended Posts