从Java访问iSeries上的RPG

时间:2008-10-08 20:57:32

标签: java java-native-interface ibm-midrange rpgle

有没有人有过直接与Java上V5R4 iSeries机器上运行的RPG程序交谈的好经验?如果是这样,社区的建议是什么,我应该避免哪些陷阱?

从我试过的各种文献和尖峰解决方案看起来好像我们可以使用ProgramCallBeans(通过PCML或xPCML),与DataQueues(用于异步通信),甚至是JNI。

我正在寻找一些强大,高效,快速开发,易于维护和易于测试的东西(不是我们所有人!?!)。

6 个答案:

答案 0 :(得分:10)

我建议使用IBM的Java Toolbox for Java。将JT400.jar放入类路径(如果Java在iSeries上运行,则为JT400Ntv.jar)。我已经使用了ProgramCall类和CommandCall类。

com.ibm.as400.access.CommandCall类易于使用。它有一个简单的构造函数,您可以将com.ibm.as400.access.AS400类传递给它。然后只需使用这样的run方法:

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

当然,你不会使用那个特定的CL命令,但你明白了。使用CommandCall类时,处理来自命令的任何消息始终是个好主意。在我使用的一个程序中,我在屏幕上的文本框中向用户显示消息,如下所示:

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

com.ibm.as400.access.ProgramCall类需要更多工作,但它允许您访问返回的参数。我经常使用这个,因为我通常会调用返回值的现有RPG工作程序。为此,请定义com.ibm.as400.access.ProgramParameter数组。将参数传递给Java中的程序时,请记住使用com.ibm.as400.access.AS400Text等类将它们转换为AS / 400友好值。使用IBM的文档http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzahh/page1.htm

可以更好地研究ProgramCall命令的详细信息

答案 1 :(得分:2)

你应该看看JTOpen。使用它来做你想做的事情相当容易。以下是某人放在一起的示例:program call to as400 using jtopen

答案 2 :(得分:1)

我们只使用JDBC和存储过程。存储过程调用RPG而不是运行SQL。我不是RPG程序员,但它看起来像一个非常简单的界面。 DataQueues没问题,但它们不像JMS那样强大(没有保证交付)。

答案 3 :(得分:1)

直接从RPG调用java方法非常简单。我不确定你要做什么,我已多次直接调用java方法。

有关如何完成此操作的示例。看看RPGMail。您可以查看源代码,了解Aaron如何使用RPG连接到JavaMail。

答案 4 :(得分:1)

我在PCML文档上取得了一些成功。我决定使用PCML,因为在将参数传递给RPG程序时将commandcall编码为字符串会变得非常难看。

PCML允许您稍微透明地将java数据类型作为参数传递给rpg程序。缺点是PCML文档中的xml成为静态接口,如果程序更新,则必须更新。使用正确的构建工具,自动更新pcml xml可能非常简单,但是现在我手动执行此操作。

当需要从java调用rpg程序时,我使用了这种方法,逻辑流程由java程序控制。

在逻辑流程由rpg程序控制的情况下,我使用数据队列来同步和异步调用java。这需要编写大量代码来标准化如何以不同的编程语言以协调的方式读取和写入数据队列

答案 5 :(得分:0)

嗯,我是新来的,会投票给KC Baltz回答,但还不行。存储过程是要走的路。我已经使用JT open来本地调用程序,并发现可以传递的parms数量问题,数据类型问题等等。一旦你有一个SQL程序包装你的程序,你会发现SQL的Java支持远远优于原始400次调用的java支持。