Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing RPG on iSeries from Java

Has anyone had good experiences of talking direct to RPG programs running on a V5R4 iSeries machine from Java? If so, what are the recommendations of the community, and what pitfalls should I try to avoid?

From the various pieces of literature and spike solutions I have attempted it looks as though we can use ProgramCallBeans (either through PCML or xPCML), talking to the DataQueues (for asynchronous comms), or even JNI.

I'm looking for something that's robust, performant, quick to develop, easy to maintain, and easy to test (aren't we all!?!).

like image 654
lawsonj2019 Avatar asked Dec 08 '22 09:12

lawsonj2019


2 Answers

I suggest using IBM's Java Toolbox for Java. Put the JT400.jar into your classpath (or JT400Ntv.jar if the Java is running on the iSeries). I've used both the ProgramCall class and the CommandCall classes.

The com.ibm.as400.access.CommandCall class is easy to use. It has a simple constructor that you pass a com.ibm.as400.access.AS400 class to. Then just use the run method like this:

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

Of course, you wouldn't use that particular CL command, but you get the idea. When using the CommandCall class, it's always a good idea to process any messages that came from the command. In the one program I use this for, I display the messages to the user in a textbox on their screen like this:

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

The com.ibm.as400.access.ProgramCall class takes more work, but it allows you to access the returned parameters. I use this one more often because I'm usually calling existing RPG worker programs that return values. For this, define a com.ibm.as400.access.ProgramParameter array. When you pass parameters to a program from Java, remember to convert them to AS/400-friendly values using a class like com.ibm.as400.access.AS400Text. The details of the ProgramCall command are better researched using IBM's documentation: http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzahh/page1.htm

like image 133
Tracy Probst Avatar answered Dec 09 '22 21:12

Tracy Probst


You should look at JTOpen. It is fairly easy to use that to do what you want to do. Here is an example someone has put together: program call to as400 using jtopen

like image 37
carson Avatar answered Dec 09 '22 22:12

carson