Appeler des programmes AS400 avec Java Spring Boot

Tuto - Comment appeler des programmes sur votre AS400 depuis votre application Java Spring Boot. On vous explique tout pas à pas !
AntoineC.jpg
Antoine CHARMEAUMis à jour le 21 Juil 2022
appel programme AS400 java spring boot

Commercialisé en 1988, l’AS400 est aujourd’hui intégré à la solution IBM, ce qui fait de lui un outil encore populaire dans les banques, hôpitaux, fabricants, distributeurs etc…

A contrario, la version 1.0 de JavaLangage de développement très populaire ! Spring BootFramework Java se basant sur Spring., sortie il y a moins de 10 ans, en avril 2014, est aujourd’hui devenue une référence pour la réalisation d’applications RESTREST (REpresentational State Transfer) est un style d'architecture logicielle qui fonctionne sous un certain nombre de contraintes..

Nous allons voir dans cet article comment appeler des programmes sur votre AS400 depuis votre application Java Spring Boot.

Générer le projet Java Spring Boot

Nous allons commencer par générer le package du projet grâce à l’outil proposé par Spring à l’adresse suivante https://start.spring.io/.

Dans cet article, nous allons générer un projet Maven en version 2.7.1 et Java 17. Il est tout à fait possible d’utiliser Gradle. Pour ce qui est des dépendances, nous avons besoin Spring Data JPA, Spring Web ainsi que Lombok. 

Java spring boot initializr as400

Une fois le projet généré, vous pouvez l’ouvrir, dans notre cas nous utiliserons l’IDEEnvironnement de développement permettant de faciliter le développement d'applications. IntelliJ.

Pour pouvoir appeler les programmes de l’AS400, vous devez ajouter la dépendance JT400 que vous pouvez trouver sur le Maven Repository.

<dependency>
    <groupId>net.sf.jt400</groupId>
    <artifactId>jt400</artifactId>
    <version>11.0</version>
</dependency>

Il n’est pas nécessaire de faire plus de configuration.

Créer votre service AS400

Pour pouvoir appeler les programmes, nous allons créer un service AS400Service avec une fonction callPgm().

package com.axopen.article.as400.service;  
import com.ibm.as400.access.*;  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.stereotype.Service;  
import java.beans.PropertyVetoException;  
import java.io.IOException;  
import java.util.ArrayList;  
import java.util.List;  
  
@Service  
@Slf4j  
public class AS400Service {  
    public List<String> callPgm(String pgmName,
        List<ProgramParameter> listParameters) {  
        List<String> responses = new ArrayList<>();  
        AS400 as400 = new AS400("URL", "IDENTIFIANT", "MOT DE PASSE");  
        ProgramCall programCall = new ProgramCall(as400);  
  
        try {  
            if (this.runCommand(as400, "CHGLIBL LIBL(LIB1 LIB2 LIB3 LIB4 ...)")) {  
                // On définit le programme et les paramètres  
                programCall.setProgram(
                    QSYSObjectPathName.toPath("SCHEMA", pgmName, "PGM"), 
                    listParameters.toArray(new ProgramParameter[listParameters.size()])
                );  
  
                if (!programCall.run()) {  
                    // Call impossible, on log les erreurs  
                    AS400Message[] messages = programCall.getMessageList();  
                    for (AS400Message msg : messages) {  
                        log.debug("AS400 - Execution error - " + msg);  
                    }  
                } else {  
                    // Call réussit, on traite les résultats  
                    AS400Text data;  
                    for (ProgramParameter parameter : listParameters) {  
                        data = new AS400Text(parameter.getOutputDataLength(), as400);  
                        responses.add(
                            data.toObject(parameter.getOutputData()).toString()
                        );  
                    }  
                }  
            }  
        } catch (Exception e) {  
            log.debug(e.getMessage());  
            if(e instanceof InterruptedException) {  
                Thread.interrupted();  
            }  
        } finally {  
            try {  
                // Make sure to disconnect  
                as400.disconnectAllServices();  
            } catch (Exception e) {  
                log.debug(e.getMessage());  
            }  
        }  
        return responses;  
    }  
  
    public boolean runCommand(AS400 as400,
        String cmdValue) throws Exception {  
        CommandCall cmd = new CommandCall(as400);  
        return cmd.run(cmdValue);  
    }  
  
    public <T> ProgramParameter createParameter(T value, int size) {  
        return new ProgramParameter(new AS400Text(size).toBytes(value), size);  
    }
}

Analysons ensemble le code ci-dessus ;

AS400 as400 = new AS400("URL", "IDENTIFIANT", "MOT DE PASSE");

Cette ligne permet de créer une nouvelle connexion à l’AS400. Il est nécessaire de fournir l’URLUniform Ressource Locator de connexion, l’identifiant, le mot de passe et le tour est joué !

Pour pouvoir appeler des programmes AS400, il peut être nécessaire de définir, au préalable, des librairies à utiliser. Pour cela on exécute une commande sur le serveur afin de charger les librairies :

this.runCommand(as400, "CHGLIBL LIBL(LIB1 LIB2 LIB3 LIB4 ...)")

On définit ensuite le programme à appeler ainsi que la liste des paramètres.

programCall.setProgram(
    QSYSObjectPathName.toPath("SCHEMA", pgmName, "PGM"), 
    listParameters.toArray(new ProgramParameter[listParameters.size()])
);

Il est nécessaire ici de spécifier le SCHEMA dans lequel appeler le programme. Enfin, le programme est appelé avec la ligne.

programCall.run()

Appeler votre premier programme

Une fois votre service AS400 implémenté correctement, il est très facile d’appeler vos différents programmes. Pour cela il faut dans un premier temps définir l’ensemble de vos paramètres d’entrée. La fonction createParameter() du service permet automatiquement de convertir vos données en AS400Text nécessaire pour faire l’appel du programme.

List<ProgramParameter> parameters = new ArrayList<>();
// ID Utilisateur sur 8 bits
parameters.add(this.as400Service.createParameter(userId, 8));
// Résultat sur 3 bits
parameters.add(this.as400Service.createParameter("    ", 3));

Dans l’AS400, la/les données retours d’un programme sont définies en paramètre d’entrée. Ici on fournit en entrée l’ID de l’utilisateur, et on attend en retour son âge sur 3 bits.

Attention l’ordre d’ajout des paramètres à une importance !

Une fois l’ensemble de vos paramètres définis, vous pouvez appeler le programme grâce à la fonction callPgm() du service crée précédemment.

List<String> results = new ArrayList<>(
    this.as400Service.callPgm("USERAGE", parameters)
);

Vous pouvez ensuite traiter vos résultats grâce à la liste de résultats obtenus.

Conclusion

Avec Spring Boot, vous pouvez mettre en place rapidement un service pour appeler facilement des programmes sur votre AS400. Rapide et flexible, c’est un excellent moyen de moderniser vos outils.

Si vous souhaitez aller plus loin dans la modernisation de votre AS400, vous pouvez nous contacter par ici !