2009-08-17 16 views
1

Iseries V5r4で実行されているRPGからJavaプログラムを呼び出そうとしています。リモートプログラムは、Websphereで実行されているWebサービスクライアント(ポストコードルックアップを実行)です。RPGからiSeries上でリモートJavaプログラムを呼び出す

理想的にはRPGから直接呼びたいと思いますか?それは可能ですか?またはiSeries上で実行するJavaプログラムを作成し、RMIなどを使用してリモートJavaプログラムを呼び出す必要がありますか。

extendral webserviceを直接呼び出すことに熱心ではありません。これは、otherside world directからiSeriesへのパスを開くことを意味します。

私はRPGプログラマーではなく、私たちの人を正しい方向に向ける何かを探しています。あるいは、RPGの人々にとってJavaプログラムをより使いやすくするために必要なものを探しています。

おかげで、 スコット

答えて

9

は、プログラムがリモートサーバー上で実行されているので、あなたは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

+0

素晴らしい投稿ありがとうございます。 RPGはJavaのリスト/マップをどのように処理するのですか?私は、(信じられない)均等物がないと言われました。私は、魅力的なアドレスマッチの配列を返す必要がありますか? – scottyab

+0

JavaとRPGの間で配列を渡すことはできますが、リストやマップは渡すことはできません。 getterメソッドとsetterメソッドを使うことをお勧めします。 –

+0

配列を渡すときは、Javaでbyte []配列の配列を作るのが最善です。 RPGで可変長の文字フィールドを使用している場合は、大丈夫です。私は実際には可変長文字フィールドを採用していませんでした。代わりにJavaでRPGに必要な長さのパッド付き文字列を作成し、バイト配列に変換するだけです。 –

3

これはWebサービスなので、別の解決策はScott KlementのHTTP APIを使用することです。彼のウェブサイトはhttp://www.scottklement.com/httpapi/です。

私にとって大きな利点の1つは、これは完全にRPGであり、時には少し不調なJavaを使用しないということです。私はJavaでWebサービスがどのように機能するかについてはあまりよく知られていませんが、XMLのすべてを作成する必要はないと思われます。 HTTP APIを使用すると、それを自分で行う必要があります。

Scott Klementには、彼のウェブサイトにいくつかの便利なことがあります。いくつかのきちんとしたツールを備えた別のサイトはhttp://www.think400.dk/downloads.htmです。

+0

私はまた、httpapiをお勧めします。本番環境で問題なく使用しました。 –

+1

十分に複雑なWSDLについては、要求と応答のXMLが複雑になるため、これは非常に面倒です。 –

関連する問題