プロダクションとその構成要素のライフ・サイクル
このページでは、参考として、プロダクションとその構成要素のライフ・サイクルについて説明します。
プロダクションのライフ・サイクル
プロダクションの起動
プロダクションを起動すると、以下に示す一連のアクションが実行されます。
-
プロダクション・クラスがインスタンス化され、オプションの OnStart() メソッドが実行されます。
-
プロダクションにより、各ビジネス・オペレーションがインスタンス化され、オプションの OnProductionStart() メソッドが実行されます。
-
プロダクションにより、各ビジネス・プロセスがインスタンス化され、オプションの OnProductionStart() メソッドが実行されます。
-
プロダクションによって、前の実行で残されたメトリック値のビジネス・メトリック・キャッシュがクリアされます。
-
プロダクションにより、各ビジネス・サービスがインスタンス化され、オプションの OnProductionStart() メソッドが実行されます。
-
プロダクションによって、既にキューに入っている項目がすべて処理されます。これには、プロダクションが停止したときにキューに入れられた非同期メッセージが含まれます。
-
これでプロダクションは InterSystems IRIS® 外部からの入力を受け付けるようになります。
プロダクションのシャットダウン
プロダクションを停止すると、以下に示す一連のアクションが生じます。
-
プロダクションにより、各ビジネス・サービスがオフラインになり、オプションの OnProductionStop() メソッドが実行されます。このアクションによって、InterSystems IRIS 外部からのすべての要求が停止します。
-
すべてのビジネス・ホストが、静止状態になるための信号を受信します。
-
すべてのキューが静止状態になります。つまり、この時点以降、ビジネス・ホストが処理できるのはキューに入れられた、優先順位の高いメッセージ (同期メッセージ) のみになります。非同期メッセージはそれぞれのキューに残ります。
-
プロダクションは、その処理能力の及ぶ限りすべての同期メッセージの処理を終了させます。
-
プロダクションにより、各ビジネス・プロセスがオフラインになり、オプションの OnProductionStop() メソッドが実行されます。
-
プロダクションにより、各ビジネス・オペレーションがオフラインになり、オプションの OnProductionStop() メソッドが実行されます。
-
プロダクションがオフラインになります。InterSystems IRIS により、このプロダクション・クラスでオプションの OnStop() メソッドが実行されます。
ビジネス・サービスとアダプタのライフ・サイクル
プロダクションの起動
プロダクションを起動 (または特定のビジネス・サービスの設定を変更) すると、InterSystems IRIS は構成済みの各ビジネス・サービス・クラス (つまり、プロダクション定義に記載されたすべてのビジネス・サービス) に対して、以下の処理を自動的に実行します。
-
定義に応じて、ビジネス・サービスの OnProductionStart() コールバック・メソッドが呼び出されます。
OnProductionStart() メソッドは、プロダクション構成に記載されているビジネス・サービス・クラスごとに一度呼び出されるクラス・メソッドです。ビジネス・サービス・クラスでは、このコールバックを使用して必要とされるクラス全体の初期化を実行できます。ビジネス・サービスにアダプタがない場合、ビジネス・サービス・クラスでは、このコールバックを使用してエラーをチェックできます。
-
InterSystems IRIS は、ビジネス・サービスを実行する 1 つまたは複数のバックグラウンド・プロセスを生成します。
バックグラウンド・プロセスの数は、プロダクション構成に記述されたビジネス・サービスの PoolSize プロパティによって決まります。各バックグラウンド・プロセスは、ビジネス・サービスのインスタンスとも呼ばれ、ビジネス・サービス・オブジェクトのインスタンスが含まれています。
InterSystems IRIS では、以下の条件が満たされている場合のみ、ビジネス・サービスのバックグラウンド・プロセスが作成されます。
-
ビジネス・サービス・クラスに、ADAPTER クラス・パラメータで指定された、受信アダプタ・クラスが関連付けられていること。
関連する受信アダプタを持たないビジネス・サービス・クラスは、“アダプタ不要型のサービス” と呼ばれます。外部イベントを待つ代わりに、そのようなサービスがプロセス内で呼び出されます (例えば、複合アプリケーションからの呼び出し)。
-
プロダクション構成内のビジネス・サービスの Enabled プロパティが 1 に設定されていること (そのように設定されていない場合、ビジネス・サービスは無効と見なされ、入力を受け付けません)。
-
プロダクション構成内のビジネス・サービスの PoolSize プロパティが 0 より大きい値に設定されていること。
プロダクション構成内にあるビジネス・サービスの Foreground プロパティを 1 に設定している場合は、InterSystems IRIS はそのビジネス・サービス用にフォアグラウンド・プロセスを生成します (つまり、InterSystems IRIS はターミナル・ウィンドウを開きます)。この機能により、テストとデバッグは効率化されます。
-
-
InterSystems IRIS は、ビジネス・サービスのステータスおよびオペレーション履歴の監視に使用するシステム監視情報を初期化します。
-
各バックグラウンド・プロセス内で、InterSystems IRIS は以下を実行します。
-
ビジネス・サービス・クラスのインスタンスを作成します。
-
すべてのビジネス・サービスの設定に最近構成された値を入力します。
-
ビジネス・サービスの OnInit() コールバック・メソッド (存在する場合) を呼び出します。OnInit() メソッドは、ビジネス・サービスの任意の初期化ロジックを実行するのに役立つインスタンス・メソッドです。
-
関連するアダプタ・クラス (定義されている場合) のインスタンスを作成し、すべてのアダプタの設定に最近構成された値を入力します。
-
実行時
プロダクションの実行時に、ビジネス・サービスは受信アダプタの OnTask() メソッドを繰り返し呼び出します。この OnTask ループは、ビジネス・サービスの CallInterval 設定および %WaitForNextCallInterval プロパティにより、以下のように制御されます。
-
ビジネス・サービスで受信アダプタの OnTask() メソッドを呼び出します。
-
OnTask() で、ビジネス・サービスの対象となる入力イベントに関して、InterSystems IRIS プロダクション外部をチェックします。
-
入力が検出されると、OnTask() は関連付けられたビジネス・サービス・オブジェクトの ProcessInput() メソッドを呼び出します。
-
入力が検出されなかった場合、OnTask() は制御をビジネス・サービスに戻し、次の CallInterval が経過するのを待ってから手順 1 に戻ります。
-
複数の入力イベントが存在する場合もあります。例えば、ビジネス・サービスで File.InboundAdapter が使用されている場合は、指定されたディレクトリで複数のファイルが待機していることがあります。
複数の入力イベントがある場合、以下のような処理が行われます。
-
一般的には、OnTask() メソッドにより、待機中の入力イベントがすべてなくなるまで必要なだけ ProcessInput() が呼び出されます。
-
また、複数の入力イベントが存在していても CallInterval ごとに 1 回だけ ProcessInput() を呼び出すように受信アダプタで OnTask() を制限できます。OnTask() は、すべての入力イベントは処理せず、最初に検出したイベントの処理を終えると、休止状態に入ります。
-
-
-
ProcessInput() は、ビジネス・サービスの %WaitForNextCallInterval プロパティを 0 (偽) に設定し、OnProcessInput() を呼び出して入力イベントを処理します。
-
完了すると、ProcessInput() は OnTask() にコントロールを戻します。
-
この時点で、OnTask() は %WaitForNextCallInterval を 1 (真) に設定することもできます。このように設定すると、複数の入力イベントが存在しても、ビジネス・サービスで CallInterval の期間に入力イベントが 1 つしか処理されないよう制限されます。
通常は、ビジネス・サービスで待機中の入力イベントをすべて遅延なく処理したいので、この時点で %WaitForNextCallInterval を変更しません。ProcessInput() で設定された 0 (偽) のままにしておきます。
アダプタ基本クラス Ens.InboundAdapterOpens in a new tab には、ProcessInput() を呼び出し、%WaitForNextCallInterval を 1 に設定して返される OnTask() メソッドがあります。
Tip:InterSystems IRIS 外部のイベントを気にすることなく、ビジネス・サービスを呼び出して、その ProcessInput() メソッドを CallInterval ごとに 1 回ずつ実行するだけであれば、アダプタ・クラスの Ens.InboundAdapterOpens in a new tab を使用します。
-
OnTask() が返されます。
-
ビジネス・サービスは、その %WaitForNextCallInterval プロパティの値をテストします。
-
1 (真) の場合、ビジネス・サービスは、CallInterval の期間が経過するのを待ってから、手順 1 に戻ります。
-
0 (偽) の場合、ビジネス・サービスは直ちに手順 1 に戻ります。OnTask() でそれ以上入力がないと判断されるまで、CallInterval は使用されません (手順 2 を参照)。
-
プロダクションのシャットダウン
プロダクションが停止すると、ビジネス・サービスに関連する以下のイベントが発行されます。
-
InterSystems IRIS は各ビジネス・サービスを無効にします。以後、このプロダクションに対する要求は受け付けられません。
-
各受信アダプタ内の OnTearDown() メソッドが呼び出されます。
-
すべての受信アダプタ・オブジェクトとビジネス・サービス・オブジェクトが破棄され、バックグラウンド・プロセスは強制終了されます。
-
プロダクション内の該当クラスの構成アイテムごとに一度、各ビジネス・サービスの OnProductionStop() クラス・メソッドが呼び出されます。
ビジネス・サービスがシステム管理者により無効化されたり、スケジュールの構成に応じて非アクティブになると、プロダクションは実行を継続しますが、関連付けられた受信アダプタは終了し、その OnTearDown() メソッドが実行されます。
ビジネス・プロセスのライフ・サイクル
プロダクションが起動するたびに、InterSystems IRIS によってそのプロダクションのパブリック・アクター・プールが作成されます。ActorPoolSize 設定の値によって、プール内のジョブ数が決定されます。
アクター・プールの各ジョブ内には、Ens.ActorOpens in a new tab オブジェクトのインスタンスがあり、このインスタンスによって、ビジネス・プロセスによるジョブの使用が管理されます。この Ens.ActorOpens in a new tab インスタンスは、アクターと呼ばれます。
プロダクションのビジネス・プロセスは、Ens.Actor と呼ばれるパブリック・メッセージ・キューを共有できます。このパブリック・キューは、独自の専用キューを持たないプロダクション内の任意のビジネス・プロセスに送信されるすべてのメッセージのターゲットになります。アクターは、ビジネス・プロセスのホスティングから解放されているときは、いつでも Ens.Actor キューをリッスンしています。Ens.Actor キューに要求が着信すると、解放されている任意のアクターが、その要求で指定されているビジネス・プロセスをホスティングするためのジョブを割り当てることがあります。Ens.Actor キューに着信した要求は、着信した順番で処理されます。連続した要求がある場合は、次に空いているアクターによって、次々に処理されていきます。
プールの詳細は、"プール・サイズとアクター・プール・サイズ" を参照してください。
ビジネス・サービスやビジネス・オペレーションのライフサイクルとは異なり、ビジネス・プロセスの OnInit メソッドおよび OnTearDown メソッドは、ビジネス・プロセスの開始時または停止時に呼び出されません。これらのメソッドは、要求がビジネス・プロセス (InProc または Queued) によって処理されるたびに実行されます。ビジネス・プロセス・クラスの OnProductionStart メソッドを実装すると、プロダクションの開始時またはビジネス・プロセスの再起動時にカスタム・コードを実行できます。このクラスの OnProductionStop メソッドは、プロダクションの停止時に呼び出されます。
パブリック・キュー内のライフ・サイクル
パブリック・キューを使用するビジネス・プロセスのライフ・サイクルを以下に示します。
-
ビジネス・プロセスに対する最初の要求が送信されます。要求メッセージが Ens.Actor キューに着信します。
-
いずれかのアクターが空き状態になると、そのアクターは直ちに Ens.Actor キューから要求メッセージを取り出します。
-
そのアクターは、適切なビジネス・プロセス・クラスの新しいインスタンスを作成します。ビジネス・プロセスの OnInit() メソッドが呼び出されます。アクターは、ビジネス・プロセスの設定に最新の値を入力し、そのインスタンスの OnRequest() メソッドを呼び出します。これで、ビジネス・プロセス・インスタンスが継続します。
-
ビジネス・プロセス・インスタンスが継続中でも、アクティブでない場合 (例えば、入力やフィードバックを待っている場合) は、通常、インスタンス化を行ったアクターに制御が戻されます。この場合、アクターは以下の処理を行います。
-
アクターがビジネス・プロセス・インスタンスを中断します。
-
アクターがインスタンスの現在の状態をディスクに保存します。
-
アクターがそのジョブをアクター・プールに返します。
-
-
継続中のビジネス・プロセスにアクターが割り当てられておらず、そのビジネス・プロセスに対して下位要求または応答が着信した場合は (例えば、予測している入力またはフィードバックが着信した場合は)、常に以下のシーケンスが発生します。
-
いずれかのアクターが空き状態になると、そのアクターが Ens.Actor キューから新しい要求メッセージまたは応答メッセージを取り出します。
-
アクターは、対応するビジネス・プロセス・オブジェクトをディスクからリストアし、そのすべてのステータス情報を復元します。
-
アクターは、状況に応じて、OnRequest() または OnResponse() というインスタンス・メソッドを呼び出します。
-
-
ビジネス・プロセス・インスタンスが実行を完了したら、その現在のアクターがその OnComplete() メソッドを呼び出し、そのインスタンスを [完了したか] ステータスでマーキングします。また、アクターはそのジョブをアクター・プールに返します。これで、このビジネス・プロセス・インスタンスにイベントが送信されなくなります。ビジネス・プロセスの OnTearDown メソッドが呼び出されます。
プライベート・キュー内のライフ・サイクル
または、ビジネス・プロセスに専用キューを割り当てて、パブリック Ens.Actor キューを迂回するように構成できます。専用キューを持つビジネス・プロセスのライフ・サイクルは、パブリック・キューの説明にあるもの同様に実行されますが、以下の点が異なります。
-
ビジネス・プロセスは、専用プールのみからジョブを実行します。
-
このビジネス・プロセスに宛てたメッセージは、その専用キューに着信し、Ens.Actor キューには着信しません。
ビジネス・オペレーションとアダプタのライフ・サイクル
InterSystems IRIS は、各ビジネス・オペレーションのライフ・サイクルを自動で管理します。
プロダクションの起動
プロダクションを起動 (または特定のビジネス・オペレーションの構成を変更) すると、InterSystems IRIS は構成済みの各ビジネス・オペレーション・クラス (つまり、プロダクション定義に記載されたすべてのビジネス・オペレーション) に対して、以下の処理を自動的に実行します。
-
定義に応じて、クラスの OnProductionStart() コールバック・メソッドが呼び出されます。
OnProductionStart() メソッドは、プロダクション構成にリストされているビジネス・オペレーション・クラスごとに一度呼び出されるクラス・メソッドです。ビジネス・オペレーション・クラスでは、このコールバックを使用して必要とされるクラス全体の初期化を実行できます。
-
ビジネス・オペレーションを実行する 1 つまたは複数のバックグラウンド・プロセスが生成されます。
バックグラウンド・プロセスの数は、プロダクション構成に記述されたビジネス・オペレーションの PoolSize プロパティによって決まります。各バックグラウンド・プロセスは、ビジネス・オペレーションのインスタンスとも呼ばれ、ビジネス・オペレーション・オブジェクトのインスタンスが含まれています。
InterSystems IRIS では、以下の条件が満たされている場合のみ、ビジネス・オペレーションのバックグラウンド・プロセスが作成されます。
-
ビジネス・オペレーション・クラスの INVOCATION クラス・パラメータが Queue に設定されていること。
-
プロダクション構成内のビジネス・オペレーションの Enabled プロパティが 1 に設定されていること (そのように設定されていない場合、ビジネス・オペレーションは無効と見なされます)。無効なビジネス・オペレーションでも受信メッセージ・キューは機能しています。ただし、このキューに送信した要求はビジネス・オペレーションを有効にしないと処理されません。
-
プロダクション構成内のビジネス・オペレーションの PoolSize プロパティが 0 より大きな値に設定されていること。
プロダクション構成内にあるビジネス・オペレーションの Foreground プロパティが 1 に設定されている場合は、InterSystems IRIS はそのビジネス・オペレーション用にフォアグラウンド・プロセスを生成します (つまり、ターミナル・ウィンドウを開きます)。この機能により、テストとデバッグは効率化されます。
-
-
これにより、ビジネス・オペレーションのステータスとオペレーション履歴の監視に使用するシステム監視情報が初期化されます。
-
各バックグラウンド・プロセスの中では、以下の処理が行われます。
-
InterSystems IRIS が、ビジネス・オペレーション・クラスのインスタンスを作成して、すべてのビジネス・オペレーションの設定に最近構成された値を入力し、ビジネス・オペレーションの OnInit() コールバック・メソッド (存在する場合) を呼び出します。OnInit() メソッドは、ビジネス・オペレーションの任意の初期化ロジックを実行するのに役立つインスタンス・メソッドです。
-
InterSystems IRIS が、関連するアダプタ・クラス (定義されている場合) のインスタンスを作成し、すべてのアダプタの設定に最近構成された値を入力します。
-
実行時
実行時は、ビジネス・オペレーションが以下の処理を行います。
-
要求が (ビジネス・サービス、ビジネス・プロセス、およびその他のビジネス・オペレーションから) 関連するメッセージ・キューに送信されるまで待機します。
-
ビジネス・オペレーションは、そのメッセージ・キューから要求を取得すると、メッセージ・マップで要求タイプに応じたオペレーション・メソッドを検索します。その後、そのオペレーション・メソッドを呼び出します。
-
オペレーション・メソッドは、要求オブジェクト内のデータを使用して、外部アプリケーションに要求を行います。通常、この処理は、関連する送信アダプタ・オブジェクトの 1 つ以上のメソッドを呼び出すことによって実行されます。
プロダクションのシャットダウン
プロダクションが停止すると、ビジネス・オペレーションに関連する以下のイベントが発行されます。
-
InterSystems IRIS は、各ビジネス・オペレーションが休止状態に至るのを待ちます (つまり、InterSystems IRIS は各ビジネス・オペレーションがすべての同期要求を完了するのを待ちます)。
-
各送信アダプタ内の OnTearDown() メソッドが呼び出されます。
-
すべての送信アダプタ・オブジェクトとビジネス・オペレーション・オブジェクトが破棄され、バックグラウンド・プロセスは強制終了されます。
-
プロダクション内の該当クラスの構成アイテムごとに一度、各ビジネス・オペレーションの OnProductionStop() クラス・メソッドが呼び出されます。
ビジネス・オペレーションがシステム管理者により無効化されたり、スケジュールの構成に応じて非アクティブになると、プロダクションは実行を継続しますが、関連付けられた送信アダプタは終了し、その OnTearDown() メソッドが実行されます。