IV: Accès à l’AS400 en JAVA : 4.1 Organisation CLIENT-SERVEUR de l'AS400 Ressources du système OS400 : - FILES : fichiers physiques et logiques , ils contiennent les données ainsi que les vues et les jointures sur ces données ( tables et autres éléments de DB2/400). - IFS : Integrated File System , c’est un système de fichiers parallèle au précédent , il permet de manipuler de fichiers organisés sous forme de bytes dans un environnement de type SHELL-UNIX.Les fichiers de ce système sont organisés en arborescence. - *DTAQ : data queues ; elles permettent l’échange de données entre programmes . - Spooled files : fichiers d’impression . - *PGM : programmes C,COBOL,CL , RPG ou autres Serveurs du système OS400 : - DB Server et DDM : serveurs permettant l’accès aux fichiers physiques( en Lecture-mise à jour-écriture) et logiques ainsi que leur interrogation via des requêtes SQL . - Byte stream Server : serveur permettant l’accès aux fichiers IFS(lecture-écriture-mise à jour) . - Dist Pgm call Server : ce serveur permet l’activation de programmes tournant sur l’AS400 à partir d’un client distant ainsi que la récupération des messages générés par ce programme . - DataQ Server : il permet l’accès aux DATAQ - Signon Server : il gère les connexions à l’AS400(user et mot de passe) - Network Print Server : il gère les accès aux fichiers d’impression. Classes et Objets JAVA sur le CLIENT : - classe AS400 : elle contient en ensemble de sockets(une par serveur) . Il est possible de créer plusieurs connexions AS400 simultanées dans la même application cliente , mais il est préférable pour des raisons d’efficacité de ne créer qu’une seule connexion à la fois . - classe JDBC : JAVA DATA BASE CONNECTIVITY : elle permet l’accès aux DB via des requêtes SQL . - classe DataQueue : représente des data queues . - classe Program : représente un programme activable à distance . - objets Serveurs : objets prédéfinis représentant un des serveurs de l’OS400. Remarques : -Pour les classes et objets mentionnés ci-dessus soient accessibles à partir du client , il faut installer sur celui-ci le package com.ibm.as400.access . Ce package est distribué gratuitement par IBM et il s’installe indifféremment sur des plates-formes UNIX,LINUX,MICROSOFT ou AS400. Ces classes sont regroupées dans une archive intitulée jt400.jar . -Pour accéder à ce package depuis un environnement Microsoft , il faut enregistrer cette archive sur le poste client dans un répertoire quelconque de la racine (par exemple packIBM) et modifier la variable d'environnement classpath : classpath = . ;c:\packIBM\jt400.jar ; ou compiler explicitement avec l’option classpath : java -classpath . ;c:\packIBM\jt400.jar MaClasse.java ou encore paramétrer les librairies de son environnement de développement (Jcreator,Jbuilder,Netbeans,Eclipse,Websphere Studio etc…) pour qu’elles pointent sur l’archive jt400.jar . Vous trouverez dans le bric-à-brac le package jt400.jar permettant l'accès à l'AS400 en JAVA 4.2 L'Integrated File System(IFS) et le QSHELL L’ IFS vous permet d’accéder au système de fichiers de l’AS400 selon une organisation en dossiers à la manière des environnements WINDOWS ou UNIX . La librairie QSYS apparaît alors sous la forme d’un dossier QSYS.LIB rattaché à la racine . Pour gérer cet environnement on utilise soit le QSHELL , sorte de shell unix permettant d’enter des commandes en mode texte , soit le I5 NAVIGATOR, permettant un accès graphique à l’arborescence à la manière de l’explorateur WINDOWS . Pour activer le QSHELL à partir de la ligne de commande CL taper : QSH . Pour sortir du QSHELL taper <F3> . cd / $ ls FICS ISEtools QDLS QFileSvr.400 QIBM $ QJAVA QNTC QOPT QOpenSys QSR QSYS.LIB QTCPTMM dev etc home hp javaIBM publichtml tmp usr Les principaux répertoires de l’IFS sont : ROOT arborescence typée UNIX de l’AS400 o home répertoires home des utilisateurs (disque Z : ) o QIBM ensemble de fichiers propres à l’AS400 fichiers d’entête .h pour le langage C archive jt400.jar les JDK fichiers nécessaires au fonctionnement du serveur websphere etc.. QSYS.LIB arborescence classique de l’OS400 QOpenSys arborescence du système AIX QOPT lecteur de DVD Pour visionner vos fichiers OS400: cd /QSYS.LIB cd J…..LIB ls COPIE.PGM DDSDEG.FILE DTAQ1.DTAQ DTAQ2.DTAQ DTATEST.DTAARA DTATEST2.DTAARA DTFACP.FILE ECR.FILE ECREX1.FILE EX1.PGM EXEMPLE1.FILE EXEMPLE1.PGM EXEMPLE1B.FILE $ OPER.FILE OPER.PGM PFVUECLI.FILE PGMCLI2.PGM PGMSUB.PGM PGMSUB2.PGM PGMSUB3.PGM PRCLI2.FILE PRODUP.FILE PROG.FILE QCLSRC.FILE QDDSSRC.FILE QJAVASRC.FILE RPGDEG.FILE RUPTURE.PGM SNDMES.PGM SQLAS4002.FILE SUB1.FILE TABLE1.FILE TEST1.PGM TEST2.PGM TESTCAT.PGM TESTDTA.DTAARA TESTMSG.PGM VUEPER.FILE Les droits dans l’espace « ROOT » sont gérés selon un modèle proche de UNIX : on utilise notamment les droits : LECTURE-ECRITURE-EXECUTION ainsi que EXCLUDE . Ces droits sont gérables par I5 Navigator ou par la commande chmod en ligne de commande QSH . 4.3 Préparation de votre environnement de travail Modification de votre profil utilisateur : Vous disposez dans le répertoire home , d’un répertoire personnel correspondant à votre username (J…) . Pour que la commande QSH vous dirige directement dans ce répertoire , vous devez modifier votre profil utilisateur : (autres paramètres) - Répertoire Initial : /home/J…. Ce répertoire correspond à votre disque Z:\ Création de votre espace de travail Dans votre répertoire personnel QSHELL créez un répertoire « mesClasses » à l’aide de la commande mkdir . Préparation de votre .profile Toujours en mode CL : EDTF <F4> Stream File : /home/J…./.profile Vous accédez alors à un éditeur type SEU , à l’aide duquel vous introduisez : export -s CLASSPATH=.:/home/j…/mesClasses:/home/classesJava:/home/classe sJava/jt400.jar echo "Bienvenue dans l'environnement QSHELL de l'I5 " Le positionnement de la variable CLASSPATH vous permettra d’activer les différentes classes JAVA nécessaires à votre application à partir de l’environnement QSH . Vous devez également positionner cette variable à partir de l’environnement CL . Positionnement de CLASSPATH en mode CL : En mode CL : ADDENVVAR ENVVAR(CLASSPATH) VALUE('=.:/home/j…/mesClasses:/home/classesJava:/home/classesJava/jt400.jar ') Cette variable d’environnement est liée au JOB interactif dans lequel elle est positionnée , elle ne subsiste donc pas d’une session à l’autre . Il est donc conseillé d’intégrer la commande cidessus dans un petit programme CL que l’on appellera lors de l’entrée en session grâce à l’option « programme initial à appeler » du profil utilisateur . PGM ADDENVVAR CLASSPATH '.:/home/j0001/mesClasses+ /home/classesJava:/home/classesJava/jt400.jar’ ENDPGM 4.4 Création de sources JAVA Pour créer des sources java sur l’AS400 on peut : -encoder le programme depuis une plate-forme LINUX ou WINDOWS puis le transférer par FTP (il faut se connecter sur son home directory) -idem mais utiliser le copier-coller pour transférer le fichier à l’aide de I5 NAVIGATOR . -encoder le programme à l’aide de l’utilitaire EDTF sur l’AS400 . -paramétrer son environnement de développement afin qu’il dépose ses sources dans le répertoire Z : \mesClasses 4.5Compilation des sources java et exécution 1°) en mode QSH javac etc… on peut alors lancer l’application par la commande java etc… 2°) optimisation Afin d’accélérer l’exécution des applications JAVA ,l’environnement AS400 offre la possibilité de créer des programmes optimisés basés sur les classes java obtenues par compilation classique . Il existe quatre niveaux d’optimisation : pas d’optimisation *INTERPRET code 10 20 30 40 optimisation faible optimisation moyenne optimisation forte optimisation totale appel à la JVM pour interpréter le full debuggable debuggage partiel debuggage partiel debuggage impossible Il convient de mettre au point les classes en mode *INTERPRET , puis seulement de les optimiser . Pour créer un programme optimisé : En mode CL CRTJVAPGM CLSF(‘/home/j…/SQLAS4001.CLASS’) OPTIMIZE(40) Remarques : -La compilation et l’optimisation peuvent être également réalisées à partir du menu contextuel de l’I5 Navigator . -La compilation peut également être lancée à partir de votre environnement de développement Microsoft , il faut alors paramétrer celui-ci afin qu’il utilise une JDK1.4 afin que les classes générées soient compatibles avec la JDK de l’AS400. 3°)Exécution en mode CL RUNJVA CLASS(SQLAS4001) JAVA Remarque : Destruction d’un pgm java optimisé : DLTJVAPGM CLSF(‘home/j…/SQLAS4001.class’) Le .class original n’est pas effacé . 4.6 Lancement d'une application JAVA en mode Batch SBMJOB CMD(JAVA CLASS(SQLAS4001)) CPYENVVAR(*YES) L’option CPYENVVAR permet de communiquer au batch les variables d’environnement nécessaires à l’exécution de la commande JAVA ( variable CLASSPATH) . Les sorties sur le périphérique standard (System.out.println) sont envoyées dans le spoole d’impression . 4.7 Communication simple avec les DataQueues Les DataQueues sont objets permettant des canaux de communication entre programmes de même type ou de types différents (JAVA avec CL par exemple) . PGM A : msg4 |msg3 |msg2 |msg1| : PGM B DTAQ On distingue les DTAQ FIFO : réception de msg1 puis msg2 ,3,4 , les DTAQ LIFO : réception de msg4 puis msg 3,2,1 , et les KEYED DTAQ qui permettent d'accéder à un message donné suivant une clé . Sous OS400 , pour créer une file de données : CRTDTAQ <F4> Indiquez vos choix, puis appuyez sur ENTREE. File d'attente de données . . . Bibliothèque . . . . . . . . . Type . . . . . . . . . . . . . . Longueur maximale de poste . . Forcer sur mémoire secondaire . Séquence . . . . . . . . . . . . EMISSION Nom *CURLIB Nom, *CURLIB *STD *STD, *DDM 10000 1-64512 *NO *NO, *YES *FIFO *FIFO, *LIFO, *KEYED Nous créons ainsi dans la librairie J0001 , deux DATAQUEUES :EMISSION et RECEPTION . Nous créons dans les espaces J0001 et J0002 deux programmes java , respectivement réception et émission . J0002 J0001 msg RECEP RECEPTION.CLASS EMISSION.CLASS ack PROGRAMME D’EMISSION import com.ibm.as400.access.*; import clavier.*; public class Emission { private static AS400 as400; private static DataQueue dqInput; private static DataQueue dqOutput; public static void main(String args[]) { try { as400 = new AS400("localhost","*CURRENT","*CURRENT"); //ou bien "as400i.lan","J0002","mot_de_passe" dqOutput = new com.ibm.as400.access.DataQueue(as400,"/QSYS.LIB/J0001.LIB/RECEPTION.DTAQ"); dqInput = new com.ibm.as400.access.DataQueue(as400,"/QSYS.LIB/J0001.LIB/EMISSION.DTAQ"); String msg; do{ System.out.print("message (*STOP pour stopper) :"); msg = Lecture.lireString(); dqOutput.write(msg); DataQueueEntry de = dqInput.read(60); //temps max d’attente String ack = de.getString();//récupération de l'acusé de réception if(ack.equals(msg)) System.out.println("message bien envoyé"); }while(!msg.equals("*STOP")); as400.disconnectAllServices(); System.out.println("déconnexion reussie"); } catch (Exception e) {System.out.println("erreur ="+e); } } } PROGRAMME DE RECEPTION import com.ibm.as400.access.*; public class Reception { private static AS400 as400; private static DataQueue dqInput; private static DataQueue dqOutput; public static void main(String args[]) { try { as400 = new AS400("localhost","*CURRENT","*CURRENT");//ou bien "as400i.lan","J0001","mot_de_passe" dqInput = new com.ibm.as400.access.DataQueue(as400,"/QSYS.LIB/J0001.LIB/RECEPTION.DTAQ"); dqOutput = new com.ibm.as400.access.DataQueue(as400,"/QSYS.LIB/J0001.LIB/EMISSION.DTAQ"); String msg; dqInput.clear(); dqOutput.clear(); //mise à blanc des deux dataqueues do{ DataQueueEntry de = dqInput.read( -1); //temps d’attente négatif ==> attente infinie msg = de.getString(); //récupération du String reçu System.out.println("reception de : " + msg); dqOutput.write(msg); }while(!msg.equals("*STOP")); as400.disconnectAllServices(); System.out.println("déconnxion reussie"); } catch (Exception e) {System.out.println("erreur ="+e); } } } Remarque : Les deux programmes ci-dessus peuvent très bien tourner sur une machine locale , il suffit d’indiquer le nom du serveur (as400i.lan ou informatique.hepmbc.be) plutôt que « localhost » et d’utiliser un username et un password explicite .