「72. ILE-RPG の対話式ソース・ディバッグ」ではILE-RPG の対話式ディバッグの方法について
紹介した。それでは CGI のディバッグはどのようにすればよいのであろうか?
CGI のディバッグは一般のPGM のようにはいかない。
CGI は STRDBGコマンドを実行するユーザーのエミュレータ画面内で実行されるのではなく
別のJOB で実行されるからである。
これはバッチJOBのディバッグと同じである。
CGI はHTTPサーバーの配下のスレッドで実行されるので別のJOBをディバッグする方法を
考案しなければならない。
■ 一般のCGI のディバッグ
別のJOBをあたかも自分のJOBとしてディバッグするにはサービス・ジョブという手法が
必要になる。
しかしサービス・ジョブを使用するには実行されるJOBのJOB番号などの識別がわかって
いなければならない。
バッチJOBであれば投入して暫く待機させるようにしてからJOB番号などを調べることが
できるが CGI ではそうはいかない。HTTPサーバー配下のどのスレッドを使用するかを
決定するのはHTTPサーバーのみぞ知るということになるので、一般的に複数のスレッド
を抱えているHTTPサーバーでは、どのスレッドで実行されるのかを予め予測することが
できない。
そこで IBM HTTPサーバーであれば
CHGHTTPA (HTTP属性の変更)
で「サーバー・ジョブの最大数」を 1 に絞ってから
HTTPサーバーを再起動する。WRKACTJOB
によってサブ・システムQHTTPSVR
のDEFAULTインスタンスの
PGM-QZHBHTTP (これがHTTPサーバー)
以外のもうひとつのJOB番号などを控えておく。- サービス・ジョブを開始する。
(STRSRVJOB)
STRSRVJOB JOB(xxxxx/xxxxx/xxxxxx)
によって今、控えたJOBのサービス・ジョブを開始する。 - ディバッグを開始する。
STRDBG MYLIB/MYPGM UPDPROD(*YES)
- ブラウザを起動して CGI を呼び出す URL を打鍵する。
- 対話式ソース・ディバッグが開始される。
■ EnterpriseServer による対話式ソース・ディバッグ
先のCGIディバッグの方法について、もう一度考慮してみよう。
先のディバッグの方法では HTTPサーバーの最大スレッド数を 1にしなければならないことが
最大の問題である。
容易に想像がつくようにこの方法は本番稼動後には行えない。
既にWebシステムが本稼動している場合ではスレッド数を1に絞るということは業務を停止
させるのと同じである。
またCGIはHTTPサーバーのひとつのスレッド内で同時に複数が併行して実行することは
できないので、これまた複数の開発者が同時にディバッグを行うことはできない。
誰かがディバッグ中であれば、別の開発者は前の人のディバッグが終了するまでは
待たされることになる。
従ってご紹介はしたものの、一般のCGI のディバッグは
- 本稼動が開始されていないこと
- ディバッグする開発担当は一人だけであること
という極めて現実的でない条件がついてしまう。
EnterpriseServer では各開発担当が各人のエミュレータ内でHTTPサーバーを
使わずに、PCOMM 上だけでディバッグ可能な「STRCGIDBG」
というディバッグ用の
コマンドが既に Ver1.0 から提供されているが Ver3.0 ではILE-RPGの利点を生かした
対話式ソース・ディバッグ機能としてコマンド WTRWEBDBG
が追加された。
これは
- HTTPSVR 「ALASKA」の配下でディバッグJOB が本番と同じように実行される。
- 本稼動中であっても本番用とは別のインスタンス
PGMR
を起動してその中で実行させることができる。 - 複数スレッド、複数開発者が同時並行してディバッグが可能
- ディバッグ処理が極めて簡単
というスグレモノである。
操作は至ってカンタンであり、HTTPサーバー ALASKAが起動されている状態で
STRWEBDBG MYLIB/MYPGM + [実行]
とするだけで上記の2〜6の処理が実行される。下記はその様子である。