この特集のトップページへ
Chapter 5:ビジネスロジック層の構築

head2.gif 5.3.2 ジャストインタイムアクティベータの問題点
 ところで,ジャストインタイムアクティベータには,少々問題がある。というのは,COMクライアントは自分が使っているCOMオブジェクトが非アクティブ化されたことを知らないのである。メソッドを呼び出したあとでCOMオブジェクトが非アクティブ化されるかどうかは,COMオブジェクトがDoneフラグをTrueに設定するか否かによる。COMオブジェクトが何もせずにメソッドから戻ってきた場合には問題ない。しかし,メソッドがDoneフラグをTrueに設定した場合には,インタセプタと切断される。ここで注意してもらいたいのは,非アクティブ化とCOMオブジェクトの破棄は同じではない,ということである。非アクティブ化されても,COMクライアント側から見えるのはインタセプタなので,COMクライアントからはまだCOMオブジェクトを握っているように見える。

 ここで,握っているそのCOMオブジェクト(実際には,これはインタセプタである)のメソッドを呼び出したとする。このとき,インタセプタの裏に隠れているCOMオブジェクトは非アクティブ化されてしまったので,インタセプタとはつながっていない。そこでCOM+は,再びCOMコンポーネントを実体化することで,COMオブジェクトを生成してインタセプタに接続する。よって,COMクライアントは,自分が握っているCOMオブジェクトのメソッドを無事に呼び出すことができる。

 しかしこのとき,新しく実体化されたCOMオブジェクトが接続されるわけであるから,非アクティブ化されるまえに使っていたCOMオブジェクトが保持していたデータは失われる結果となる(Fig.5-13)。

Fig.5-13 COMオブジェクトの非アクティブ化とアクティブ化
fig5_13.gif

 たとえば,List 5-3のような実装を考えてみる。

 List 5-4のプログラムを実行した場合,FuncBメソッドの戻り値は空文字になる。なぜなら,List 5-3FuncAメソッドの9行目にあるSetCompleteメソッドの呼び出しによってDoneフラグがTrueに設定されるため,FuncAメソッドから戻ると,COMオブジェクトは非アクティブ化されて,COMオブジェクトが保持しているstrBuff変数の内容が破棄されてしまうからである。

 つまり,ジャストインタイムアクティベータ機能を使うCOMオブジェクトは,メソッドから戻ると破棄される恐れがあるために,データをCOMオブジェクトの内部に保持してはならない。いい換えると,「オブジェクト」ではなく,「特定の仕事をする関数」のような形態でCOMコンポーネントを実装しなければならないということである。内部にデータをもたないオブジェクトのことを,「ステートレスオブジェクト」と呼ぶ。

 詳細は「5.4 COM+のトランザクション機能」で説明するが,トランザクション機能を使うCOMコンポーネントは自動的にジャストインタイムアクティベータの機能が有効になる。そのため,トランザクション機能を使うCOMコンポーネントもステートレスオブジェクトとなるよう実装する必要がある。

prevpg.gif Chapter 5-1 10/23 nextpg.gif