我正在寻找从Iseries V5r4上运行的RPG调用Java程序。远程程序是在Websphere中运行的Web服务客户端(执行邮政编码查找)。
理想情况下,我想直接从RPG中调用它?那可能吗?或者我是否必须创建一个在iSeries上运行的java程序,并使用RMI或其他东西来调用远程java程序。
我们并不热衷于直接调用extenral webservice,因为它意味着从其他世界直接向iSeries开放路径。
我不是一个RPG程序员,只是想找点事情指出我们的人正确的方向或我需要做的任何事情,以使java程序更适合RPG人员。
谢谢, 斯科特
答案 0 :(得分:9)
由于程序在远程服务器上运行,因此无法直接从RPG中调用它。鉴于它是一个Web服务,我将创建一个在iSeries上运行的Java程序,并从RPG中调用该Java程序。现在,RPG可以直接与Java连接。你必须创建一些D-specs来声明类并将方法调用原型化。在下面的示例中,假设在“工具”包中存在一个名为ServiceCaller的Java类。它有一个名为getServiceReply的方法,它接受三个字符字段并返回一个整数。
*Define the Java class locally. DServiceCaller S O CLASS(*JAVA:'tools.ServiceCaller') *Class constructor. No parameters. DnewServiceCaller PR O EXTPROC(*JAVA: D 'tools.ServiceCaller': D *CONSTRUCTOR) D CLASS(*JAVA:'tools.ServiceCaller') *GetServiceReply. *public int getServiceReply(byte[] parm1, byte[] parm2, byte[] parm3) DgetServiceReply PR 10I 0 EXTPROC(*JAVA: D 'tools.ServiceCaller': D 'getServiceReply') D Parm1 400A CONST D Parm2 400A CONST D Parm3 400A CONST
您的RPG计算规范将类似于此自由格式示例:
/free ServiceCaller = newServiceCaller(); iReply = getServiceReply(ServiceCaller:'Parm1':'Parm2':'Parm3'); /end-free
在java代码中,在getServiceReply方法中,将这些字节数组转换为如下字符串:
sParm1 = new String(parm1); sParm2 = new String(parm2); sParm3 = new String(parm3);
当然,这是一个过于简单的示例,您的应用程序需求会略有不同。如果Web服务没有回复,您将需要添加错误处理代码。您可能还想在课堂上使用getter和setter。这完全取决于您的应用程序需求和远程Web服务的要求。
关于Java类型的RPG类型的一些注释:
RPG Type Java Type 10I 0 int 3I 0 byte 5I 0 short 20I 0 long N boolean A byte[]
如果您感觉特别雄心勃勃,可以从RPG中调用本机Java HTTP类。但是我发现一个自定义Java程序作为一个中间人,专门用来与RPG交谈是一种更容易的方法。尽管RPG可以与Java交谈,但它并不像Java与Java交谈那么漂亮。
有关从RPG调用Java的更多信息,请参阅ILE RPG程序员指南。可以在此处找到V5R4版本:http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/books/sc092507.pdf
答案 1 :(得分:3)
由于这是一个Web服务,另一个解决方案是使用Scott Klement的HTTP API。它可以在他的网站http://www.scottklement.com/httpapi/上找到。
对我来说最大的好处之一是它完全是RPG并且不使用任何有时候有点迟钝的Java。我并不熟悉Web服务如何在Java中工作,但似乎您不必构建所有XML并且已经为您完成了。使用HTTP API,您需要自己完成。
Scott Klement在他的网站上还有其他一些有用的东西。另一个带有一些简洁工具的网站是http://www.think400.dk/downloads.htm。