从Java访问iSeries上的RPG



有没有人有过直接与运行在V5R4 iSeries机器上的Java RPG程序对话的良好经验?如果是的话,社会上有什么建议,我应该尽量避免哪些陷阱?

从我尝试的各种文献和spike解决方案来看,我们似乎可以使用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类传递给它

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。使用它来做你想做的事情是相当容易的

我们只使用JDBC和存储过程。存储过程调用RPG而不是运行SQL。我不是一个RPG程序员,但它似乎是一个非常简单的界面。DataQueues还可以,但它们不如JMS那样健壮(不能保证交付)。

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

举例说明如何做到这一点。看看RPGMail。您可以查看源代码,了解Aaron是如何使用RPG连接到JavaMail的。

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

PCML允许您在某种程度上透明地将java数据类型作为参数传递给rpg程序。缺点是PCML文档中的xml变成了一个静态接口,如果程序被更新,则必须进行更新。有了正确的构建工具,自动化pcml-xml的更新可能非常简单,但现在我正在手动完成这项工作。

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

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

以协调的方式读取和写入数据队列

嗯,我是新来的,会投票给KC Baltz,但还不能。存储过程是最好的选择。我已经使用JT-open以本机方式调用程序,并发现了可以传递的parm数量、数据类型等问题。一旦您在程序中使用了SQL过程包装器,您就会发现Java对SQL的支持远远优于Java对本机400调用的支持。

最新更新