2008-10-08 67 views
4

有没有人有直接谈论从Java运行于V5R4 iSeries机器上的RPG程序的良好体验?如果是这样,社区的建议是什么,我应该尽量避免哪些陷阱?从Java在iSeries上访问RPG

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

我正在寻找稳健,高效,快速开发,易于维护和易于测试的东西(不是我们都是!?!)。

回答

1

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

+1

我们已经非常自由地使用JDBC访问DDS或DDL SQL表,并取得了很好的成功。我们还使用了存储过程(都调用RPG程序和本机SQL)。但是,我们发现RPG存储过程并不擅长处理复杂的返回结构或结果集。 – lawsonj2019 2008-10-10 19:10:00

1

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

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

+0

它从Java调用我们需要做的RPG - 而不是来自RPG的Java。 – lawsonj2019 2008-10-10 19:10:45

2

你应该看看JTOpen。用它来做你想做的事很容易。下面是一个人已经放在一起的例子:program call to as400 using jtopen

+0

我们一直在使用开源JTOpen(其中有很棒的开发人员)以及提供的JT400库和IBM Toolbox for iSeries,并取得了良好的效果。我只想看看我是否正朝着正确的方向前进,或者是否有其他方式(如JNI等)。 – lawsonj2019 2008-10-10 19:12:14

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的文档可以更好地研究ProgramCall命令的细节:http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzahh/page1.htm

1

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

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

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

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

0

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