は、プログラムがリモートサーバー上で実行されているので、あなたはRPGから直接呼び出すことはできません。それがWebサービスだとすれば、iSeries上で実行するJavaプログラムを作成し、そのJavaプログラムをRPG内から呼び出すことになります。現在、RPGはJavaと直接インターフェースできます。クラスを宣言してメソッド呼び出しをプロトタイプ化するために、いくつかのD-specを作成する必要があります。次の例では、パッケージ 'tools'にServiceCallerというJavaクラスが存在すると仮定します。 3つの文字フィールドを受け取り、整数を返すgetServiceReplyという単一のメソッドがあります。 getServiceReplyメソッド内で、次のように文字列にそれらのバイト配列を変換し、Javaコード内
/free
ServiceCaller = newServiceCaller();
iReply = getServiceReply(ServiceCaller:'Parm1':'Parm2':'Parm3');
/end-free
:
*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のCALCの仕様は、この自由形式の例のようになります
sParm1 = new String(parm1);
sParm2 = new String(parm2);
sParm3 = new String(parm3);
許可されていますが、これは単純化された例であり、アプリケーションのニーズはわずかに異なります。 Webサービスが応答しない場合は、エラー処理コードを追加することをお勧めします。また、クラスにゲッタとセッタを使用することもできます。それはすべて、アプリケーションのニーズとリモート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の中で動作するカスタムJavaプログラムがRPGとの会話のために書かれたものであることがわかりました。 RPGはJavaと話すことができますが、JavaとJavaの話が同じようにはありません。
RPGからJavaを呼び出す方法に関する追加情報は、「ILE RPGプログラマーズ・ガイド」に記載されています。 http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/books/sc092507.pdf
素晴らしい投稿ありがとうございます。 RPGはJavaのリスト/マップをどのように処理するのですか?私は、(信じられない)均等物がないと言われました。私は、魅力的なアドレスマッチの配列を返す必要がありますか? – scottyab
JavaとRPGの間で配列を渡すことはできますが、リストやマップは渡すことはできません。 getterメソッドとsetterメソッドを使うことをお勧めします。 –
配列を渡すときは、Javaでbyte []配列の配列を作るのが最善です。 RPGで可変長の文字フィールドを使用している場合は、大丈夫です。私は実際には可変長文字フィールドを採用していませんでした。代わりにJavaでRPGに必要な長さのパッド付き文字列を作成し、バイト配列に変換するだけです。 –