プログラムはリモートサーバー上で実行されているため、RPGから直接呼び出すことはできません。これがWebサービスであるとすると、iSeriesで実行するJavaプログラムを作成し、RPG内からそのJavaプログラムを呼び出します。今日では、RPGはJavaと直接インターフェースできます。クラスを宣言し、メソッド呼び出しのプロトタイプを作成するには、いくつかのD仕様を作成する必要があります。次の例では、パッケージ'tools'にServiceCallerというJavaクラスが存在すると仮定します。これには、3つの文字フィールドを受け入れて整数を返すgetServiceReplyという単一のメソッドがあります。
*Javaクラスをローカルで定義します。
DServiceCaller SO CLASS(* JAVA:'tools.ServiceCaller')
*クラスコンストラクタ。パラメータはありません。
DnewServiceCaller PR O EXTPROC(* JAVA:
D'tools.ServiceCaller':
D *コンストラクター)
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の計算仕様は、次の自由形式の例のようになります。
/自由
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サービスが応答しない場合に備えて、エラー処理コードを追加することをお勧めします。クラスでゲッターとセッターを使用することもできます。それはすべて、アプリケーションのニーズとリモートWebサービスの要件によって異なります。
RPGタイプからJavaタイプへの注意事項:
RPGタイプJavaタイプ
10I 0 int
3I0バイト
5I0ショート
20I0長い
Nブール
バイト[]
特に野心的な場合は、RPG内からネイティブJavaHTTPクラスを呼び出すことができます。しかし、RPGと通信するために特別に作成された中間として機能するカスタムJavaプログラムの方が、より簡単な方法であることがわかりました。RPGはJavaと通信できますが、JavaがJavaと通信するほどきれいではありません。
RPGからJavaを呼び出すための追加情報は、ILE RPGプログラマー・ガイドにあります。V5R4バージョンはここで見つけることができます:http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/books/sc092507.pdf