java jni ibm-midrange rpgle

Accediendo a RPG en iSeries desde Java



jni ibm-midrange (6)

¿Alguien ha tenido buenas experiencias de hablar directamente con programas RPG que se ejecutan en una máquina V5R4 iSeries desde Java? De ser así, ¿cuáles son las recomendaciones de la comunidad y qué peligros debo tratar de evitar?

De las diversas piezas de literatura y soluciones de pico que he intentado, parece que podemos usar ProgramCallBeans (ya sea a través de PCML o xPCML), hablar con las DataQueues (para comunicaciones asíncronas) o incluso JNI.

Estoy buscando algo que sea robusto, de rendimiento, rápido de desarrollar, fácil de mantener y fácil de probar (¿no somos todos?).



Solo usamos JDBC y procedimientos almacenados. El procedimiento almacenado llama al RPG en lugar de ejecutar SQL. No soy un programador de rol, pero parece una interfaz muy simple. Las colas de datos son correctas, pero no son tan robustas como algo como JMS (no hay entrega garantizada).


Es bastante simple llamar a los métodos de Java directamente desde RPG. No estoy seguro de qué es exactamente lo que intenta hacer. He realizado varias llamadas directamente a los métodos de Java.

Para un ejemplo de cómo se hace esto. Eche un vistazo a RPGMail . Puede ver la fuente y ver cómo Aaron usó RPG para conectarse a JavaMail.


He tenido cierto éxito con los documentos PCML. Decidí usar PCML desde que codifiqué la llamada de comando en una cadena cuando pasar parámetros a un programa de RPG puede ponerse realmente feo.

PCML le permite pasar de manera transparente tipos de datos java a un programa rpg como parámetro. El inconveniente es que el xml en el documento PCML se convierte en una interfaz estática y debe actualizarse si el programa se actualiza alguna vez. Con las herramientas de compilación adecuadas, puede ser bastante sencillo automatizar la actualización de pcml xml, pero ahora lo hago de forma manual.

He usado este enfoque cuando el programa de rpg necesita ser llamado desde Java, y el flujo de la lógica es controlado por el programa de Java.

En un caso en el que el flujo lógico estaba controlado por un programa rpg, he utilizado las colas de datos para las llamadas síncronas y asíncronas a java. Esto requirió escribir una cantidad significativa de código para estandarizar sobre cómo leer y escribir en las secuencias de datos de manera coordinada desde diferentes lenguajes de programación


Hmm, soy nuevo aquí y votaría la respuesta de KC Baltz, pero todavía no puedo. Los procedimientos almacenados son el camino a seguir. He usado JT abierto para llamar programas de forma nativa y he encontrado problemas con la cantidad de parms que se pueden pasar, problemas con los tipos de datos, etc. Una vez que tienes un envoltorio de procedimientos SQL alrededor de tu programa, encontrarás el soporte de Java para SQL. ser muy superior al soporte de Java para llamadas nativas de 400.


Sugiero usar la Java Toolbox para Java de IBM. Coloque el JT400.jar en su classpath (o JT400Ntv.jar si el Java se ejecuta en el iSeries). He usado tanto la clase ProgramCall como las clases de CommandCall.

La clase com.ibm.as400.access.CommandCall es fácil de usar. Tiene un constructor simple al que le pasas una clase com.ibm.as400.access.AS400. Entonces solo usa el método de ejecución así:

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

Por supuesto, no usarías ese comando CL en particular, pero entiendes la idea. Al usar la clase CommandCall, siempre es una buena idea procesar cualquier mensaje que provenga del comando. En el programa en el que uso esto, visualizo los mensajes para el usuario en un cuadro de texto en su pantalla de esta manera:

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

La clase com.ibm.as400.access.ProgramCall requiere más trabajo, pero le permite acceder a los parámetros devueltos. Utilizo este más a menudo porque normalmente llamo a los programas de trabajo RPG existentes que devuelven valores. Para esto, defina una matriz com.ibm.as400.access.ProgramParameter. Cuando pasa parámetros a un programa de Java, recuerde convertirlos a valores compatibles con AS / 400 utilizando una clase como com.ibm.as400.access.AS400Text. Los detalles del comando ProgramCall se investigan mejor con la documentación de IBM: http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzahh/page1.htm