CL プログラムを呼び出す Java アプリケーションがあります。CL プログラムは、JT400 ライブラリーを使用して、IBM i システム上でいくつかの RPG プログラムを実行します。
最初は、このように毎回新しい接続を開き、完了したら閉じました。
new AS400(hostname, username, password);
ただし、接続の量が増加しているため、最近接続プールの使用を開始しました。
@Bean
public AS400ConnectionPool as400ConnectionPool() {
String hostname = env.getProperty("AS400Hostname");
String username = env.getProperty("AS400Username");
String password = env.getProperty("AS400Password");
AS400ConnectionPool as400ConnectionPool = new AS400ConnectionPool();
as400ConnectionPool.setMaxConnections(128);
try {
// Preconnect 5 connections to the AS400.COMMAND service.
as400ConnectionPool.fill(hostname, username, password, AS400.COMMAND, 5);
} catch (ConnectionPoolException e) {
log.error(e.getMessage());
e.printStackTrace();
}
return as400ConnectionPool;
}
各接続は、閉じられるのではなく、使用後にプールに返されるようになりました。
残念ながら、以前は完全に実行されていたのと同じジョブが見られるようになり、IBM i でステータス MSGW になることもありました。(メッセージ待ち)
ジョブ ログを分析しているときに、最後に次のタイプのエラーがあることに気付きました。
ファイルの OPEN 中に CPF4131 が表示された
2 つの異なるライブラリから同時にジョブを実行すると発生するようです。プログラムは通常、IBM i に対して約 10 の接続を同時に開いており、多くの異なるジョブが同時に実行されている可能性があります。ほとんどは同じ 1 つのライブラリーからのもので、別のライブラリーにあるものはわずかです。後で同じ呼び出しを実行すると、問題なく実行されます。
プログラム呼び出しを実行しているライブラリは、このプログラムで参照されていない他のライブラリのファイルを探しているようです。
たとえば、次の CL 呼び出し:
CALL PGM(ADDPRGXX/TESTCL)
最終的に、後続の RPG 呼び出しで次のようなエラーが発生します。
TESTRPG *INIT ADDPRGXX OPEN SOMEFILE CPF4131 メンバー SOMEFILE を持つライブラリー ADDFILXS 内のファイル SOMEFILE のレベル検査。
&N 原因 . . . . . : ライブラリ ADDPRGXX 内の RPG プログラム TESTRPG は、ファイル SOMEFILE に対して暗黙の OPEN を実行中に、メッセージ CPF4131 を受け取りました。メッセージ CPF4131 の完全な説明については、ジョブ・ログを参照してください。ファイルの装置タイプが SPECIAL の場合、ジョブ・ログにメッセージがない場合があります。&N 回復。. . : キャンセルするには C、システム ストレージの印刷出力を取得するには S、システム ストレージの RPG 形式の印刷出力を取得するには D、またはシステム ストレージの完全な形式の印刷出力を取得するには F を入力します。&N message に返信するための可能な選択肢。. . . . . . . . . . . . . . : &B D -- システム ストレージの RPG 形式の印刷出力を取得します。&B S -- システム ストレージの出力を取得します。&B F -- システム ストレージの完全にフォーマットされたプリントアウトを取得します。&B C -- キャンセル。
例の SOMEFILE は ADDFILXS には存在しませんが、ADDFILXX にのみ存在し、ADDFILXS はプログラム呼び出しで参照されることはありません。
CL プログラムは、必要なライブラリーを追加することから始めて、次に RPG を呼び出します。
ADDLIBLE LIB(ADDPRGXX) MONMSG MSGID (CPF0000) ADDLIBLE LIB(ADDFILXX) MONMSG MSGID (CPF0000) CALL TESTRPG
後続の RPG 呼び出しで使用するライブラリーへの参照が必要ですか? あるいは、これを防ぐために接続プールで何か他のことをする必要がありますか?
ライブラリごとに 2 つの個別のプールを使用し始めましたが、これは機能しているようです。しかし、根本的な原因を見つけて修正することをお勧めします。