サーバー クラス インスタンスのライフサイクル
サーバー クラス インスタンスのライフサイクル
TDSServerClass メタクラスには LifeCycle というプロパティがあり、このプロパティによって、どのような状況でサーバー メソッド クラスのインスタンスが新しく作成されるか、どのような状況で既存のインスタンスが再利用されたり破棄されるかが決まります。
LifeCycle プロパティの種類
このプロパティの選択肢には、Server、Session、Invocation があります。これは、一般的に次のように解釈することができます。
- Server: 実行中のサーバーごとに 1 つのインスタンスが作成されます(シングルトン)。
- Session: アクティブなクライアント接続ごとに 1 つのインスタンスが作成されます。
- Invocation: クライアントからの呼び出しごとに新しく 1 つのインスタンスが作成されます(ステートレス)。
REST クライアント
REST クライアント接続で、サーバー クラスの LifeCycle が Session の場合には、LifeCycle が Invocation のときと同じ動作になります。
接続の切断
クライアントの接続(REST 接続以外のもの)が突然切断された場合、デフォルトでは、OnDisconnect イベントは発生しません。これは、試みられた IO 操作が失敗するまでは、ソケットが開いたままになっているからです。LifeCycle プロパティが Session の場合、サーバー クラスのインスタンスはダングリング状態になり、サーバーが停止されるまで解放されません。LifeCycle プロパティが Invocation に設定されていて、呼び出し中(応答がクライアントに送信される前)に接続が切断された場合も、サーバー クラスのインスタンスはやはり、サーバーが停止されるまで破棄されません。
ただし、すべての TCP/IP 接続に対してキープアライブ パケットを使用するように OS が構成されている場合は、その構成を基に、EnableKeepAlive メソッドと DisableKeepAlive メソッドを使って、この動作を制御できます。詳細については、「DataSnap 用 TCP/IP 接続の監視と制御 - 予期せぬ切断の検出」セクションを参照してください。
メモ: サーバー クラスの LifeCycle の詳細については、Delphi ラボにアクセスして、Paweł Głowacki による Delphi ラボ ビデオの第 2 話をご覧ください。