从Java访问iSeries上的RPG

从Java访问iSeries上的RPG,java,java-native-interface,ibm-midrange,rpgle,Java,Java Native Interface,Ibm Midrange,Rpgle,有没有人有过从Java直接与V5R4 iSeries机器上运行的RPG程序对话的良好经验?若然,社会人士有何建议?我应避免哪些陷阱 从我尝试过的各种文献和spike解决方案来看,似乎我们可以使用ProgramCallBeans(通过PCML或xPCML)、与数据队列(用于异步通信)甚至JNI通信 我正在寻找一种健壮、性能好、开发速度快、易于维护、易于测试的产品(难道我们都是!?!)。我们只使用JDBC和存储过程。存储过程调用RPG而不是运行SQL。我不是一个RPG程序员,但它似乎是一个非常简单的

有没有人有过从Java直接与V5R4 iSeries机器上运行的RPG程序对话的良好经验?若然,社会人士有何建议?我应避免哪些陷阱

从我尝试过的各种文献和spike解决方案来看,似乎我们可以使用ProgramCallBeans(通过PCML或xPCML)、与数据队列(用于异步通信)甚至JNI通信


我正在寻找一种健壮、性能好、开发速度快、易于维护、易于测试的产品(难道我们都是!?!)。

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

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


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

您应该了解。用它来做你想做的事情是相当容易的。下面是一个有人总结的例子:

我建议使用IBM的Java工具箱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)");
AS400Message[] messageList = command.getMessageList();
for (int i=0;i < messageList.length;i++) {
String sMessageText = messageList[i].getText();
    sMessage+=sMessageText + "\n";
}
当然,您不会使用那个特定的CL命令,但您明白了。使用CommandCall类时,最好处理来自命令的任何消息。在我使用它的一个程序中,我在屏幕上的文本框中向用户显示消息,如下所示:

CommandCall command = new CommandCall(as400);
command.run("CPYF FROMFILE(BLAH) TOFILE(BLAHBLAH) CRTFILE(*YES)");
AS400Message[] messageList = command.getMessageList();
for (int i=0;i < messageList.length;i++) {
String sMessageText = messageList[i].getText();
    sMessage+=sMessageText + "\n";
}
AS400Message[]messageList=command.getMessageList();
for(int i=0;i

com.ibm.as400.access.ProgramCall类需要更多的工作,但它允许您访问返回的参数。我更经常使用这个,因为我通常调用返回值的现有RPG工作程序。为此,请定义com.ibm.as400.access.ProgramParameter数组。当您从Java向程序传递参数时,请记住使用com.ibm.as400.access.AS400Text之类的类将其转换为AS/400友好值。使用IBM的文档可以更好地研究ProgramCall命令的细节:

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

PCML允许您将java数据类型作为参数透明地传递给rpg程序。缺点是PCML文档中的xml变成了一个静态接口,并且必须在程序更新时进行更新。使用正确的构建工具,自动化PCMLXML的更新可能非常简单,但现在我正在手动进行

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


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

嗯,我是新来的,我会投票支持KC Baltz的回答,但现在还不能。存储过程是未来的发展方向。我使用JT open本机调用程序,发现可以传递的PARM数量、数据类型等问题,等等。一旦您的程序有了SQL过程包装器,您就会发现Java对SQL的支持远远优于Java对本机400调用的支持。

我们非常自由地使用JDBC访问DDS或DDL SQL表,并取得了很好的成功。我们还使用了存储过程(既可以调用RPG程序,也可以使用本机SQL)。然而,我们发现RPG存储过程并不擅长处理复杂的返回结构或结果集。我们需要能够从Java调用RPG,而不是从RPG调用Java。我们一直在使用开源JTOpen(顺便说一句,它有很多优秀的开发人员)并且,为iSeries提供了带有IBM工具箱的JT400库,效果良好。我只是想看看我是否朝着正确的方向前进,或者是否还有其他方法(比如JNI等)。