どんな技術に関するソフトウェアにおいても,設計して構築し始めると小さな問題が数多く発生する。結局のところ,その技術の設計者は各開発者がそれをアプリケーションでどのように使おうとするかを知ることができない。このことが,アプリケーションの構築時に大量のトライ&エラーを行なわなければならない理由の1つである。
この記事では,MTS(Microsoft Transaction Server)とIIS(Internet Information Server)に使うコンポーネントの構築,より具体的に言えばコンパイルのための役に立つ情報を示す。これによって開発の過程でよく出会う落とし穴を避けることができる。
ASPコンポーネント
まず始めに,ASPアプリケーションで使われているコンポーネントを再コンパイルする必要があるときにどうするかについて話そう。ASPコード内からコンポーネントを使う際,コンポーネントの削除,置き換え,再コンパイルを行なうには,次の2つの作業のうち1つを行なわなければならない。ASPアプリケーションがIISと同一プロセス内で実行中の場合,ファイルの変更の前にIISを終了しておく必要がある。ASPアプリケーションが別プロセスで実行中の場合には,アプリケーションのDirectory Propertiesページで「Unload」ボタンをクリックすればよい。IISを終了するか,もしくはアプリケーションをアンロードしたら,コンポーネントの削除,置き換え,再コンパイルが可能になる。
これらの処理は面倒なものだ。というのはほとんどの人々はそれらの作業を行なうのにInternet Service Managerを起動してそれを使うからだ。IISの終了や再起動にはもっと簡単な方法がある。この2つの作業は,どちらもNetコマンドを使ってコマンド行から行なうことができる。私は自分のために,IISの終了および再起動を行なう2つの小さなコマンドファイルを作った。
IISを終了する必要があるときには,以下のコマンドファイルを実行する。
IISStop.cmd
net stop iisadmin /yes
これによりiisadminサービスが終了する。これは順次,ほかのWebサービスを終了させる。iisadminサービスは,ASPページ内で使われているコンポーネントを置き換えられるようになる前に終了されていなければならない。
IISの再起動には,以下のコマンドファイルを実行する。
IISStart.cmd
net start iisadmin
net start w3svc
net start smtpsvc
このファイルはiisadmin,w3svc,smtpsvcサービスを再起動する。これらはそれぞれ明示的に再起動しなければならない。というのは,iisadminの終了はほかのものを終了させるが,iisadminの再起動はほかのサービスを自動的に再起動しないからだ。
MTSコンポーネント
さて今度はMTSについて,そしてMTSがアプリケーションにどのように使われるかについて見てみよう。私は開発作業のほとんどを自分のワークステーション上で行なっている。コンポーネントがより広範囲なテストを行なう準備ができたら,そのコピーをテストのためにサーバ上に公開する。自分のワークステーション上での開発は時間の節約になる,というのはサービスの起動や終了を,ネットワーク上のほかの人々をわずらわせずに行なえるからだ。また私は,MTSのアドイン,すなわちVisual Basicトランザクションサーバのアドインが存在することに気づいた。これはコンポーネントが再コンパイルされたあとに,自動的にMTSパッケージ内のそのコンポーネントを更新する。コンポーネントをコンパイルしたあとに,MTS内のそれを削除して再び組み込む必要がなくなるのだから,これはたいしたものだ。また,このアドインによって,パッケージ内のすべてのコンポーネントを更新することもできる。
MTSアドインはWindows NT Option Packの標準のインストールではインストールされない。インストールするには,まずWindows NTのOption Pack setupを起動する。「Add/Remove」ボタンをクリックし,それからコンポーネントの一覧からTransaction Serverを選択し,「Show Components」をクリックする。次に,Transaction Server Developmentを選択し,もう一度「Show Components」をクリックする。最後に, Figure 1に示されているように,Visual Basic Transaction Server Add-inが選択されていることを確認する。このアドインを選択したら,「OK」をクリックしてインストール処理を完了する。
アドインをインストールすると,それはVisual Basicの[Add-Ins]メニューに表示されるようになる。このアドインはデフォルトで使用可能になり Figure 2に示すように自動的にコンポーネントをリフレッシュするよう,設定される。この動作のオンオフは,1つ目のメニューオプションを選択することで切り替える。
さて,念のため,コンポーネントをMTSで使うための手順をひととおり眺めてみよう。まず,Visual Basicでそのプロジェクトをオープンする。Microsoft Transaction Server Type Libraryへのプロジェクト参照を生成し,それからプロシジャの先頭に以下のコードを追加することでMTSコンテキストへの対応を追加する。
Dim Ctx As ObjectContext
Set Ctx = GetObjectContext
これでこのコンポーネントはMTSとやり取りを行なえるようになり,必要に応じてSetCompleteやSetAbort,その他のMTSの機能を使うことができるようになる。
作業を先に進める前に,プロジェクトのプロパティを開いて[Components]タブをクリックする。[compatibility]プロパティに“Project”か“Binary”のどちらかが設定してあることを確認すること。通常,テストの間はProjectを使えばよい。[compatibility]プロパティを設定しないと,コンポーネントの再コンパイル時に毎回新しいGUIDが生成されるために問題が発生するだろう。これにより,MTSが新しくコンパイルされたコンポーネントを発見することができなくなり,それを使おうとする際に次のようなエラーが起きることになる。
Microsoft VBScript runtime error '800a01ad'
ActiveX component can't create object: 'MTSDB.Recordset'
/MIND/MTSDriver.asp, line 31
このエラーが出たら,Task ManagerでMTSが何をしているかを調べなければならない。プロセスをイメージ名でソートしたら,MTX.EXEを見てみること。IISを使っているときには常にそれらのプロセスの1つが実行されていることが分かるだろう。MTSがコンポーネントをロードしようとしてそうできない場合には,そのパッケージのための新しいMTX.EXEが起動してすぐに終了するのが分かるだろう。そして先述の実行時エラーがブラウザに表示されるのだ。先に示したように,[compatibility]プロパティに“Project”を設定しておくことでこれを避けることができる。
次に,クラスに対してMTSトランザクション形式を設定する。トランザクション形式の設定はMTS ExplorerからでもVisual Basicからでも行なえる。私はVisual Basicから設定するほうが好きだが,Visual Basicがそれをコンポーネントにコンパイルして,コンポーネントがMTSに組み込まれるたびにその設定を正しく行なうからだ。トランザクション形式を設定するために,Visual Basic Project Explorerで作業中のクラスを選択する。次に,propertiesウィンドウで適切なトランザクション形式を選択する。トランザクション形式の設定は, Figure 3(MTSのドキュメントからの引用)に示す表に従って行なえばよい。
トランザクション形式を設定したら,コンポーネントをコンパイルし,それをMTSに組み込めばよい。これを行なうには,MTSのパッケージが必要だ。新しいパッケージを生成するために,MTS Explorerを起動してPackages Installedフォルダを選択する。Packages Installedを右クリックして[New]を選び,続いて[Package]を選ぶ。次に,[Create an empty package]をクリックする。パッケージ名を入力して「Next」をクリックする。テストのために自分のワークステーション上にパッケージを構築するのであれば,securityをInteractive userに設定したままで「Finish」をクリックしてよい。
このパッケージがサーバ上で使われるものなら,このパッケージIDに有効なアカウントを設定しなければならない。MTSが使うための専用のアカウントを作成して,それに必要なパーミッションと権利を与えることをお薦めする。それからこのアカウントを Figure 4で示すようにMTSパッケージに割り当てる。
パッケージIDの入力は,パッケージの作成時またはパッケージの使用時のどちらでも可能だ。パッケージにあとからIDを追加するには,MTS Explorerでパッケージの[properties]を開き,[Identity]タブを選択する。パッケージに割り当てるアカウントのパスワードが必要だ。
さてこれでコンポーネントをMTSに組み込めるようになった。Windows Explorerでこのコンポーネントをドラッグし,それをMTSパッケージのComponentsフォルダにドロップする。また,パッケージ内にコンポーネントを組み込むのには,パッケージのComponentsフォルダのコンテキストメニューから[New]を選択し,続いて質問される事項に答えてゆけばよい。ドラッグ&ドロップによるパッケージの組み込みに問題があった場合には,MTS Explorerのメニューを使えばよい。
これであなたのパッケージがMTS内に組み込まれたので,それを使うアプリケーションを実行してテストを始めることができる。コンポーネントの再コンパイルが必要になったとき,MTSには何が起きるだろうか。さてこれからがおもしろいところだ。パッケージがServerパッケージとして実行されている(つまり専用のプロセス空間内で実行中である)場合,IISを終了させる必要はない。単にパッケージ自体を終了させればよい。これを行なうにはMTS Explorerをオープンしてそのパッケージを右クリックし,ショートカットメニューから[shut down]を選択すればよい。これによりそのパッケージをホストしているMTX.EXEのコピーが終了し,コンポーネントの再コンパイルが可能になる。
ときおり,何かがそのコンポーネントをオープンしたままにしているために再コンパイルできなくなっているように見えることがある。Visual InterDevを使っていて,あるコンポーネントを使うページをオープンしたままである場合,このページをクローズするまでは再コンパイルできない。これはVisual InterDevがそのコンポーネントへの参照を保持していて,その参照がある限りは再コンパイルを許可しないためだ。
MTSパッケージの終了の自動化
コンポーネントを再コンパイルするためにしょっちゅうMTSを終了させるのは面倒なことだ。IISを終了させるよりは時間がかからないが,MTS Explorerへの切り替えなどの手間が必要だ。ありがたいことに,MTSAdminオブジェクトのインターフェイスを使うとこの処理を自動化できる。私はローカルシステム上でパッケージを終了させるVisual Basicのコードを作った( Figure 5, Figure 6)。
Figure 5はアプリケーションのためのコードだ。このアプリケーションをコマンド行のパラメータなしで実行すると,frmMTSUTilInterfaceがMTSパッケージの一覧を表示する。パッケージを選択すると, Figure 7に示すとおり「Shutdown Package」ボタンが現われる。このボタンをクリックすると選択されているパッケージを終了する。
また,パッケージを自動的に終了するのにこのアプリケーションをパラメータ付きで実行することもできる。このときのコマンド行は次のようになる。
MTSUtil.exe \Shutdown MindMTS
このコマンドはMindMTSパッケージを終了する。もっとすばやく処理するために,現在作業中の各パッケージについてタスクバー上にアイコンを作っておくこともできる。そしてそのアイコンのプロパティを編集して先ほど示したコマンド行と同じように関連するパッケージ名を指定すればよい。このタスクバー上のアイコンをクリックすることでパッケージが終了する。
Figure 6に示したコードが,MTSAdminオブジェクトを使ってすべての処理を行なう。Visual Basicのコードでこれらの関数を使うには,MTS 2.0 Admin Type Libraryへのプロジェクト参照を生成する必要がある。
また,Visual Basicで書かれたアプリケーションやコンポーネントをコマンド行でコンパイルすることもできる。コマンドラインからコンパイルするには,以下の構文でVisual Basicを起動すればよい。
"c:\program files\microsoft visual studio\vb98\vb6.exe" /make MTSDB.vbp
このコマンドはコマンドラインから/makeパラメータ付きでVisual Basicを起動し,MTSDBコンポーネントをコンパイルする。このコマンド全体は1行でなければならず,実行ファイルの長いファイル名は忘れずに引用符でくくらなければいけない。
コンパイル処理をより単純にするために,MTSUtil.vbpアプリケーションに関数を追加して,パッケージの終了後に自動的にパッケージ内のコンポーネントをコンパイルするようにできる。Visual Basic内でShellコマンドを使えばよい。そうすると,再コンパイルのために必要な作業はそのコンポーネントに変更点を保存してアイコンをクリックするだけになる。これですべての処理が行なわれるのだ。
まとめ
今回のIISおよびMTSのためのコンポーネントの構築についての解説で分かるように,コンポーネントについての一見素直で単純な変更と再コンパイルの処理ですら予期できない問題を発生させることがある。しかし,よくあるコンパイル時の問題点についてあらかじめ知っていれば,コンポーネントの構築時に多くの時間を節約でき,苦労を避けることができる。
Ken Spencer:Ken Spencerは,Microsoftの技術に関する高品質なセミナー業務を専門に行なう会社 32X Tech Corporationで働いている。連絡先は,kenspencer@32x.comまで。
|