从调用RPG iSeries上的远程Java程序
-
18-09-2019 - |
题
我期待调用从RPG在iSeries V5R4上运行的Java程序。远程程序是一个网络服务客户端(执行邮政编码查找),在WebSphere运行。
在理想情况下,我想叫它从RPG直接?那可能吗?或者我必须创建一个Java程序在iSeries运行并使用RMI或东西来调用远程Java程序。
我们并不热衷于调用webservice的extenral直接,因为它意味着从阿瑟赛德世界开放通道直接到i系列。
我不是一个RPG程序员,只是寻找一些指向我们的球员在正确的方向或任何我需要启用使Java程序的RPG乡亲更消耗品。
谢谢, 斯科特
解决方案
由于该程序在远程服务器上运行,则不能直接从RPG调用它。鉴于这是一个Web服务,我将创建一个Java程序在iSeries上运行,并从内部RPG调用Java程序。 Nowaday的,RPG可与Java直接接口。你不得不创造一些d-规范申报类和原型出来的方法调用。在下面的例子中,假设一个Java类存在所谓的包“工具” ServiceCaller。它有一个称为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);
当然,这是一个简化的示例和应用程序的需要会稍有不同。您将要添加错误处理代码的情况下,网络服务不回答。您可能还需要使用getter和setter方法在你的类。这一切都取决于您的应用需求和远程网络服务的要求。
在RPG类型的一些注意事项为Java类型:
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 /信息中心/ i系列/ V5R4 /主题/书籍/ sc092507.pdf
其他提示
由于是web服务,另一种解决方案是使用斯科特克莱门特的HTTP API。它可在他的 http://www.scottklement.com/httpapi/ 网站。
一个对我很大的好处是,这是完全RPG,并且不使用任何Java它可以是一个有点呆滞的时候。我并不真正熟悉的Web服务在Java中是如何工作的,但似乎你没有形成所有的XML和它为你做。随着HTTP API,你需要做的是你自己。
还有斯科特·克莱门特在他的网站上其他一些有用的东西。一些灵巧的工具的另一个站点 http://www.think400.dk/downloads.htm