Appel de méthode Java depuis RPG (appel de méthode dans sa propre classe)

Un mémorandum pour appeler les méthodes Java de ILE RPG. Il est également décrit dans «IBM Rational Development Studio for i ILE RPG Programmer's Guide» (IBM i version 7.2), mais il n'a pas été écrit en détail, donc je l'ai essayé.

L'environnement d'IBM i qui a été exécuté est la version: V5R4, Java: 1.4.2. (Il a également fonctionné sur V7R2 et Java 1.8.0.)

Pour le rendre un peu plus pratique, j'ai créé un programme qui renvoie l'état des travaux en cours. Passez une chaîne de caractères (nom du travail) comme argument et renvoyez la chaîne de caractères (statut). (Si le même nom de travail existe plusieurs fois, l'état du premier travail acquis est renvoyé.)

Vérification de l'environnement IBM i

Ce n'est pas grave si la commande suivante renvoie la version Java.

CHGJOB CCSID(5035)
STRQSH
java -version

Structure des dossiers

La structure des dossiers d'IFS sur IBM i est la suivante.

/Root
  |-JavaApps
     |-/bin
        |-/mypackage
            |-As400Funcs.class
     |-/lib
        |-jt400.jar
     |-/src
        |-/mypackage
            |-As400Funcs.java

Préparation du programme 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;
	}
}

Compilation de programmes Java et exécution de tests

Définissez les variables d'environnement. (Veuillez vous déconnecter une fois pour vous en assurer.)

ADDENVVAR ENVVAR(CLASSPATH) VALUE('/JavaApps/bin:/JavaApps/lib/jt400.jar')

Compilation et exécution de test (QSHELL)

javac -d /JavaApps/bin /JavaApps/src/mypackage/As400Funcs.java
java mypackage/As400Funcs

Dans l'exemple, le nom de travail de l'argument était "DSP01", Veuillez spécifier le travail en cours d'exécution. Ce n'est pas grave si vous pouvez obtenir le statut correctement.

Préparer et compiler des programmes RPG

GETJOBSTSR.rpgle


      *                                                                                      
      *Exemple de programme qui appelle les méthodes JAVA
      *                                                                                      
                                                                                             
     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')      //Type de retour
     D  string                         O   CLASS(*JAVA:'java.lang.String') Const//Paramètres
                                                                                  
     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) 

Exécuter le programme RPG

CALL GETJOBSTSR PARM('DSP01') 

C'est OK si l'état du travail est affiché à l'écran.

Erreur "Exception JAVA reçue lors de l'appel de la méthode JAVA"

java.lang.NoClassDefFoundError

Dans la plupart des cas d'erreur, la variable d'environnement "CLASSPATH" est incorrecte. Surtout une fois le RPG exécuté, la JVM démarre avec ce travail, puis

ADDENVVAR ENVVAR(CLASSPATH) VALUE('/JavaApps/bin:/JavaApps/lib/jt400.jar')

** N'est pas reflété ** même si est exécuté. (Il semble que vous ne puissiez pas redémarrer la JVM, vous devez vous déconnecter une fois.)

Recommended Posts

Appel de méthode Java depuis RPG (appel de méthode dans sa propre classe)
Appel de méthodes Java à partir de JavaScript exécutées en Java
Appeler la classe scellée de Kotlin depuis Java
Appelez la super méthode en Java
Implémentez l'interface Java dans la classe JRuby et appelez-la depuis Java
GetInstance () à partir d'une classe @Singleton dans Groovy à partir de Java
Appeler Java depuis JRuby
Comment obtenir une classe depuis Element en Java
Programmation Java (méthode de classe)
[Java] Obtenir KFunction à partir de la méthode / du constructeur en Java [Kotlin]
Appeler une méthode avec le bloc de rappel de Kotlin depuis Java
Ecrire une classe en Kotlin et l'appeler en Java
Appeler un programme écrit en Swift depuis Processing (Java)
Appelez votre propre méthode avec PreAuthorize dans Spring Security
Comment obtenir le nom d'une classe / méthode exécutée en Java
[Kotlin] Obtenez le constructeur / la méthode Java de KFunction et appelez-le
Chaîne d'appels depuis la chaîne dans l'intégration Spring
[Java] Syntaxe orientée objet - Méthode / argument de classe
Méthode de redimensionnement automatique des photos par Java
Gérez vos propres annotations en Java
Classe StringBuffer et StringBuilder en Java
Appelez l'API Java de TensorFlow depuis Scala
[java] Ce que j'ai fait en comparant des listes dans ma propre classe
[Java] Wrapper qui exécute la méthode privée d'un objet depuis l'extérieur de la classe
Étudiez le Deep Learning à partir de zéro en Java.
[Java] Passer des arguments au constructeur dans Mockito / Définir l'appel par défaut à la méthode à callRealMethod
Méthode Java
java (méthode)
Appeler la bibliothèque Java à partir de C avec JNI
Appeler l'API GitHub à partir de l'API Socket de Java, partie 2
Comprenez l'interface java à votre manière
Appelez l'API de notification Windows en Java
Méthode de concurrence en Java avec exemple de base
[Débutant] Méthode / classe / bibliothèque externe Java [Note 23]
Inverser la clé de la valeur dans la carte Java
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce qu'une classe en langage Java (2 /?)
Pourquoi Java appelle-t-il un fichier une classe?
Quelle est la méthode principale en Java?
Méthode Java
Méthode de classe
[Java] méthode
Obtenir l'historique du serveur Zabbix en Java
Création d'une classe de matrice dans Java Partie 1
[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe
Appeler la reconnaissance visuelle dans Watson Java SDK
[Java] Méthode d'instance, champ d'instance, méthode de classe, champ de classe, résumé du constructeur
Méthode d'opération d'élément dans Appium TIPS (Java)
Lors de l'appel de println etc. à partir d'un fichier de classe Java externe en traitement
[Java] méthode
Nommer et appeler explicitement des méthodes de classe parent dans Ruby
Incrémenté du troisième argument de la méthode iterate de la classe Stream ajoutée depuis Java9
La cause n'est pas visible lors de l'appel de méthodes d'autres classes en java
[Java] Gestion des Java Beans dans la chaîne de méthodes
[Java] Appel de méthode dynamique par réflexion du type enum (enum)
J'ai essayé de frapper une méthode Java d'ABCL
Extraction de texte en Java à partir de PDF avec pdfbox-2.0.8
[Java SE 11 Silver] Résumé des méthodes de classe Arrays [Java débutant]
Java à partir du débutant, déclaration de classe / génération d'objet