有没有人从 Java 直接与运行在 V5R4 iSeries 机器上的 RPG 程序交谈的良好经验?如果是这样,社区的建议是什么,我应该尽量避免哪些陷阱?
从我尝试过的各种文献和尖峰解决方案来看,看起来我们可以使用 ProgramCallBeans(通过 PCML 或 xPCML)、与 DataQueues(用于异步通信)甚至 JNI 通信。
我正在寻找一种健壮、高性能、快速开发、易于维护和易于测试的东西(我们不都是!?!)。
有没有人从 Java 直接与运行在 V5R4 iSeries 机器上的 RPG 程序交谈的良好经验?如果是这样,社区的建议是什么,我应该尽量避免哪些陷阱?
从我尝试过的各种文献和尖峰解决方案来看,看起来我们可以使用 ProgramCallBeans(通过 PCML 或 xPCML)、与 DataQueues(用于异步通信)甚至 JNI 通信。
我正在寻找一种健壮、高性能、快速开发、易于维护和易于测试的东西(我们不都是!?!)。
我建议使用 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 的文档可以更好地研究 ProgramCall 命令的详细信息:http: //publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp ?topic=/rzahh/page1.htm
你应该看看JTOpen。使用它来做你想做的事情是相当容易的。这是某人整理的一个示例:program call to as400 using jtopen
直接从 RPG 调用 java 方法非常简单。我不确定您到底要做什么,我已经多次直接调用 java 方法。
有关如何完成此操作的示例。看看RPGMail。您可以查看源代码并了解 Aaron 如何使用 RPG 连接到 JavaMail。
我们只使用 JDBC 和存储过程。存储过程调用 RPG 而不是运行 SQL。我不是 RPG 程序员,但它似乎是一个非常简单的界面。DataQueue 还可以,但是它们不如 JMS 之类的强大(没有保证交付)。
我在 PCML 文档方面取得了一些成功。我决定使用 PCML,因为在将参数传递给 RPG 程序时将命令调用编码为字符串会变得非常难看。
PCML 允许您以某种方式透明地将 java 数据类型作为参数传递给 rpg 程序。缺点是 PCML 文档中的 xml 成为静态接口,如果程序更新,则必须更新。使用正确的构建工具,自动更新 pcml xml 可能非常简单,但现在我正在手动执行此操作。
当需要从java调用rpg程序时,我就使用过这种方法,并且逻辑流程由java程序控制。
在逻辑流程由 rpg 程序控制的情况下,我使用数据队列对 java 进行同步和异步调用。这需要编写大量代码来标准化如何以协调的方式从不同的编程语言读取和写入数据队列
嗯,我是新来的,会投票给 KC Baltz 回答,但还不能。存储过程是要走的路。我使用 JT open 来本地调用程序,发现可以传递的参数数量、数据类型等问题。一旦你的程序有一个 SQL 过程包装器,你会发现 Java 对 SQL 的支持远远优于java对本机400调用的支持。