Delphi/400からIBM i(AS/400)上のCLやRPGを起動すると、
その処理が終わるまでPC側に制御が戻らないようにできています。
(TAS400.RemoteCmdや、TCmd400・TCall400使用時など共通)
これは、IBM i 側で実行した処理の終了を確実に把握するために必要なことなのですが、
非常に時間のかかるバッチ処理を起動したい場合などでは、クライアントのアプリケーションに
長い間制御が戻らず、フリーズしているように見える事になります。
このフリーズ(に見える現象)を回避するには、
IBM i の SBMJOB(ジョブ投入)コマンドを利用しします。
これを使うと、別のジョブにコマンドが投入されるため、
IBM i 側の処理結果を待たずにDelphi/400側へ制御を戻すことができます。
例えばTAS400コマンドのRemoteCmdメソッドを使用する場合は
以下のように記述することができます。
「XXXX」が起動したいRPGプログラムだったとします。
AS4001.RemoteCmd(‘SBMJOB CMD(CALL XXXX)‘);
このようにDelphi/400から起動するJOB側では
SBMJOBコマンドを実行し、JOBを投入するだけですぐに制御が戻ります。
そして起動された別のJOBで「CALL XXXX」という
時間のかかる処理を行うことができます。
/*以下のような5秒待つだけのCLPを作ると検証しやすい*/
PGM
DLYJOB DLY(5) /*5秒待機*/
RETURN
ENDPGM
これを応用すると、極論にはなりますが
実行後は制御が戻らなくなるIBM i の電源断やIPL(再起動)等も
エラーを出さずに実行できます。
以下に即時IPLを行う例をあげます。
言うまでもありませんが、このコマンド実行後は速やかにDelphi/400の接続を切る必要があります。
if Application.MessageBox('即時IPLします。本当によろしいですか?',
'警告', 308) = IDYES then
begin
// 即時再起動コマンドをジョブ投入
AS4001.RemoteCmd('SBMJOB CMD(PWRDWNSYS OPTION(*IMMED) RESTART(*YES))');
// IBM i 側で接続が切られる前に、こちらから接続を切る
AS4001.Disconnect;
end;
※今回のSBMJOBコマンドは、時間がかかる処理を投入後は放置しておける要件下でのみ利用可能です。
処理結果をもとに後続処理を行う場合は、従来通り処理完了を待つ必要があります。
※弊社では、今回のソースコードを使用したことによって生じうる、
いかなる障害・損失に関しても一切の責を負いかねますので、ご了承下さい。
(ミガロ.情報マガジン「MIGARO News!!」Vol.043 2004年8月号より)