一般に CGI は HTML をブラウザに排出すると同時に LR-終了
するような処理構造を
取っています。これは多くのクライアント(ブラウザ) からの要求に応えるために本来、
Web適用業務としての基本的な処理のルールです。
従ってある適用業務の初期画面を出力すると、CGI は同時に終了し、
次に明細画面が入力されたときには、改めて最初から変数値を取得したりの処理を
最初から始めなければなりません。( このような処理構造を ステートレス と呼びます。)
これに対して 5250適用業務では、ご存知のように EXFMT
命令コードで次のユーザーからの入力をプログラムが待機していますので、画面が表示されている場合でも適用業務プログラムが終了しているわけではなく、従って変数値等のあらゆる情報も保持されたままになっています。
( このような処理構造を ステートフル と呼びます。)
初めて Web適用業務を見る5250適用業務の開発経験者は HTMLインターフェースを見るとWebサーバー側でCGI が EXFMT
のように次の入力を待機しているかのような錯覚に陥ることがありますが、
CGI はHTML 画面を印刷出力のように出力してしまえば直ちに
LR-終了
する、単なるバッチ・プログラムであることを良く理解しておいてください。
簡単な Webアプリであれば前に処理しておいて次の処理で必要となるデータは HTML の中に
hidden
という非表示の文字列として保管しておいて、次の処理ではこれらを読み取って処理を
継続させることができます。しかし適用業務の構造によっては、
QTEMP
に一時的なデータ保存を行いたい。COMMIT-ROLLBAK
を利用したい。という必要性が発生する場合があります。
このようなときには 5250適用業務と同じように、あたかも EXFMT
のように処理が連続しているかのような擬似環境が必要となります。
ところが Web実行環境ではさらに次のような問題があります。
QTEMP
を利用することはできない。
特に前者の現実を考えると QTEMP
と COMMIT
の利用は不可能に思えてしまいます。
そこで一般の Webアプリケーションでは、データだけをユニークな識別を使ってどこかに保存しておいてから
後で復元するという苦肉の策が講じられています。
しかしこの場合でもデータの保管/復元は可能となますが QTEMP
や COMMIT
と使用することはできません。
さらに次のような歴史的な難問が控えています。
JavaBeans
や他社製品でも「セッション管理ができます!」と高らかに唄っていたはずがこれらの問題があるため
今ではすっかり強調することがなくなったのは、このような問題が顕在化してきたためです。
次はあるユーザーでのセッション・ファイルの残骸の様子です。
オブジェクト タイプ 属性 サイズ テキスト IWR01 *FILE PF 1363968 セッション管理ファイル IWR01L1 *FILE LF 188416 セッション管理ファイル IWR02 *FILE PF 600920064 セッション変数ファイル IWR02L1 *FILE LF 7372800 セッション変数ファイル IWR02L2 *FILE LF 32555008 セッション変数ファイル
この製品ではセッション・データを物理ファイルに保管するという手段をとっているためにこのような
莫大なゴミが重ねられてやがては DISK
を圧迫してパフォーマンスも日々低下することは目に見えています。
これは製品開発メーカーの技術の問題でもあると言えるかも知れません。
それでは RPG# ではユーザーが希望するセッション管理は、どのように解決されているのでしょうか ?
RPG# によるセッション管理は、とてもシンプルでやさしいものです。
あなたは eStudio の Wizard
で生成するときに
「 セッションを維持する 」
としてチェックを入れるだけです。これでセッション管理は完了です。
セッション管理のための特別なプロシージャーを呼び出したりする必要は全くありません。
この指示によって生成される HTML には次の HTML 文が一行、追加されます。
<input type="hidden" name="AURORA_EGN" value="######">
このわずかな一行に、実行した子スレッド・ジョブのジョブ番号が非表示として保存されます。
HTTP サーバー: ALASKA は、このジョブ番号があるブラウザからの要求を受け取ると
必ず元の同じジョブ番号の子スレッド・ジョブに要求を戻します。
つまりこのわずかな一行によって必ず同じジョブでの処理が継続されて実行されることになります。
さらにセッション管理が指示されたときには、CGI は終了することなく次のユーザーからの入力を
待機し続けます。
次はその様子を表している WRKACTJOB
の画面です。
現行 OPT サブシステム/ジョブ ユーザー タイプ CPU % 機能 状況 __ ENTPRSSVR QSYS SBS .0 DEQW __ ALASKA QTMHHTTP BCH .0 PGM-ALASKA_V5 TIMW __ AURORA_EGN QTMHHTTP BCI .0 PGM-AURORA_EGN TIMW __ AURORA_EGN QTMHHTTP BCI .0 PGM-AURORA_EGN TIMW __ AURORA_EGN QTMHHTTP BCI .0 PGM-AURORA_EGN TIMW __ AURORA_EGN QTMHHTTP BCI .0 PGM-AURORA_EGN TIMW __ AURORA_EGN QTMHHTTP BCI .0 PGM-AURORA_EGN TIMW __ AURORA_EGN QTMHHTTP BCI .0 PGM-AURORA_EGN TIMW
ユーザー : PGMR
としてセッション管理が指定された Webアプリは次のユーザーからの要求を待機し、
たとえ 1分経過後に通信が切断されたとしてもタイマー・ジョブが起動されてユーザーの Webアプリは
一定時間のタイマーのあいだは、待機し続けます。この動作は 5250適用業務の EXFMT
と同じです。
QTEMP
に一時的なデータ保存を行いたい。COMMIT-ROLLBAK
を利用したい。従って、上記のユーザーの要求も問題なく叶えられ、どこかにセッション・データを保存しておく必要すらありません。
つまりユーザーのセッション保持のこれらの要求を満足するだけでなく、セッション管理ファイルの残骸が大量に残る
という前述の製品のような深刻な問題も全く発生することはありません。
RPG# では「戻るボタン」や「Xボタン」の問題はどのように解決されるのでしょうか ?
RPG# で「セッションを維持する」を指示して HTML を生成すると最後に次のようなJavaScript
記述も
追加されます。
<script type="text/javascript" src="/AS400-NET.USR/JS/ARR_JOBCTL.JS"></script>
この ARR_JOBCTL.JS
という名前の JavaScript は、「戻るボタン」や「Xボタン」の問題を解決します。
「戻るボタン」を押すと、その操作は HTTPサーバー: ALASKA に確実に伝えられてRPG# は、実行スタックを
以前の状態に強制的に戻します。
いわば RPG の ROLLBK
に良く似た状態の復元であり、これによって明細画面として待機していた処理は
初期画面の処理に引き戻されます。これは UNIX でのスタック復元技術が使用されています。
「Xボタン」を押したときも終了通知が確実に ALASKA に伝えられて Webアプリは浮いたままになることなく
確実に終了します。この技術は潟Iフィスクアトロが Microsoft社の支援を受けて半年間を要して開発した
「仮想対話式環境」と呼ばれる技術です。
さらに RPG# では Webアプリが待機していなくてもセッション・データを保持することができます。
「 セッションを維持する 」
にチェックを入れるのではなく、ユーザーが独自に HTML に
<input type="hidden" name=SESSION value="################################">
のようにして 32桁の文字列を埋め込むための HTML タグを用意しておいてから
SET_SESSION (セッション・データの保存) と GET_SESSION (セッション・データの復元)
というプロシージャーを使って、セッション・データの保管と復元を行うことができます。
SET_SESSION
を実行すると RPG# はセッション・データを独自に作成して、その識別子を上記の
SESSION
という値に埋め込みます。
この 32桁の値は実際には 16桁の HEXコード
であり、System i では GUID
( General Universal
) と呼ばれる
Unique IdentificationOS400 API
が生成する一意的な重複のないコードです。
つまりブラウザ上で複数の画面(セッション) を起動したり多くのユーザーが同時に入力したとしても
決して重複することはありません。
参考までに先の製品ではファイルによって識別子を生成しているために多くのユーザーからの
アクセスがあるとデッド・ロックを起こしてしまうので担当者が 24時間、交代で監視しているという
例まであります。
さて、RPG# ではセッション・データはライブラリー: QRPLOBJ
のユーザー待ち行列として保管されます。
ライブラリー : QRPLOBJ とはシステム的に用意された System i のゴミ箱のような特殊ライブラリーであり
次の IPL では OS400 によって QRPLOBJ の中身は必ずクリーン・アップされます。
このことにより、次の利点を得ることができます。
IPL クリーン・アップ
されるので残骸は残らない。このようにユーザーを面倒から解放し、パフォーマンスに優れ、それでいてユーザーの希望を
叶えるものでなくては製品としてリリースすることはできません。