2008-10-08 7 views
4

Est-ce que quelqu'un a déjà eu de bonnes expériences en parlant directement à des programmes RPG fonctionnant sur une machine V5R4 iSeries de Java? Si oui, quelles sont les recommandations de la communauté, et quels pièges dois-je essayer d'éviter? Parmi les différentes solutions de documentation et de pointe que j'ai essayées, il semble que nous puissions utiliser ProgramCallBeans (soit via PCML ou xPCML), soit en dialoguant avec DataQueues (pour les communications asynchrones), soit même avec JNI.Accéder à RPG sur iSeries à partir de Java

Je cherche quelque chose qui est robuste, performant, rapide à développer, facile à entretenir, et facile à tester (sommes-nous pas tous!?!). Nous utilisons simplement JDBC et les procédures stockées.

Répondre

1

La procédure stockée appelle le RPG au lieu d'exécuter SQL. Je ne suis pas un programmeur RPG, mais il semble être une interface très simple. DataQueues sont OK, mais ils ne sont pas aussi robuste que quelque chose comme JMS (pas de livraison garantie).

+1

Nous avons utilisé JDBC assez librement pour accéder à des tables SQL DDS ou DDL avec un bon succès. Nous avons également utilisé des procédures stockées (appel des programmes RPG et du SQL natif). Cependant, nous avons constaté que les procédures stockées RPG ne sont pas très efficaces pour gérer des structures de retour complexes ou des ensembles de résultats. – lawsonj2019

1

Il est assez simple d'appeler des méthodes java directement à partir de RPG. Je ne suis pas sûr exactement ce que vous essayez de faire, j'ai fait des appels directement aux méthodes de Java plusieurs fois.

Pour un exemple de la façon dont cela est fait. Jetez un oeil à RPGMail. Vous pouvez regarder la source et voir comment Aaron a utilisé RPG pour se connecter à JavaMail.

+0

Il appelle RPG de Java, nous devons être en mesure de faire - pas Java à partir de RPG. – lawsonj2019

2

Vous devriez regarder JTOpen. C'est assez facile à utiliser pour faire ce que vous voulez faire. Voici un exemple que quelqu'un a mis en place: program call to as400 using jtopen

+0

Nous avons utilisé à la fois l'open source JTOpen (qui a de grands développeurs btw) et la bibliothèque JT400 fournie avec IBM Toolbox for iSeries avec de bons résultats. Je veux juste voir si je suis dans la bonne direction avec ceci, ou s'il y a d'autres manières (telles que JNI, etc.). – lawsonj2019

10

Je suggère d'utiliser Java Toolbox for Java d'IBM. Placez le JT400.jar dans votre classpath (ou JT400Ntv.jar si Java est en cours d'exécution sur l'iSeries). J'ai utilisé à la fois la classe ProgramCall et les classes CommandCall.

La classe com.ibm.as400.access.CommandCall est facile à utiliser. Il a un constructeur simple que vous passez une classe com.ibm.as400.access.AS400 à. Ensuite, il suffit d'utiliser la méthode d'exécution comme ceci:

CommandCall command = new CommandCall(as400); 
command.run("CPYF FROMFILE(BLAH) TOFILE(BLAHBLAH) CRTFILE(*YES)"); 

Bien sûr, vous n'utiliser cette commande particulière CL, mais vous voyez l'idée. Lorsque vous utilisez la classe CommandCall, il est toujours conseillé de traiter les messages issus de la commande. Dans le premier programme que j'utilise cela pour, j'afficher les messages à l'utilisateur dans une zone de texte sur leur écran comme ceci:

AS400Message[] messageList = command.getMessageList(); 
for (int i=0;i < messageList.length;i++) { 
String sMessageText = messageList[i].getText(); 
    sMessage+=sMessageText + "\n"; 
} 

La classe com.ibm.as400.access.ProgramCall prend plus de travail, mais il permet vous pour accéder aux paramètres renvoyés. J'utilise celui-ci plus souvent car j'appelle généralement les programmes de travail RPG existants qui renvoient des valeurs. Pour cela, définissez un tableau com.ibm.as400.access.ProgramParameter. Lorsque vous transmettez des paramètres à un programme à partir de Java, n'oubliez pas de les convertir en valeurs compatibles avec AS/400 en utilisant une classe comme com.ibm.as400.access.AS400Text. Les détails de la commande ProgramCall sont mieux fait des recherches en utilisant la documentation d'IBM: http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzahh/page1.htm

1

J'ai eu un certain succès avec des documents PCML. J'ai décidé d'utiliser PCML car encoder le commandcall dans une chaîne quand passer des paramètres à un programme RPG peut devenir vraiment moche.

PCML vous permet de passer un peu de manière transparente les types de données Java à un programme rpg comme paramètre. L'inconvénient est que le fichier XML dans le document PCML devient une interface statique et doit être mis à jour si le programme est mis à jour. Avec les bons outils de construction, il peut être assez simple d'automatiser la mise à jour du pcml xml, mais maintenant je le fais manuellement.

J'ai utilisé cette approche lorsque le programme rpg doit être appelé à partir de Java, et le flux logique est contrôlé par le programme Java.

Dans un cas où le flux logique était contrôlé par un programme rpg, j'ai utilisé des files d'attente de données pour les appels synchrones et asynchrones vers Java. Cela nécessitait d'écrire une quantité importante de code pour standardiser la façon de lire et d'écrire de manière coordonnée dans des langages de programmation différents langages de programmation

0

Hmm, je suis nouveau ici et je voterais KC Baltz répondre, mais je ne peux pas encore. Les procédures stockées sont la voie à suivre. J'ai utilisé JT open pour appeler les programmes en mode natif et j'ai trouvé des problèmes avec le nombre de paramètres pouvant être transmis, les problèmes avec les types de données, etc. Une fois que vous avez un programme SQL autour de votre programme être bien supérieur au support Java pour les 400 appels natifs.

Questions connexes