2. DATASNAP WINDOWSターゲット
DataSnap 2010は、VCLフォーム、Windowsサービス、そしてコンソールアプリケーションの3つの異なったWindowsターゲットをサポートしています。この章では、それぞれのメリットと違いについて、そして、それぞれのターゲットタイプを適用するベストケースについて説明します。
DataSnapサーバーとクライアントの使用例を構築することによって、TDSServer、TDSServerClass、TDSTCPServerTransport、TDSHTTPService、TDSHTTPWebDispatcherそしてTDSHTTPService-AuthenticationManagerコンポーネントと、同様にカスタムサーバーメソッドとTDSServerModuleクラスをカバーします。
異なったトランスポートプロトコル(TCP、HTTP)についてはそれらの効果と潜在的なメリットを説明していきます。DataSnapサーバーオブジェクトのライフタイムについての異なったオプション(サーバー、セッション、そして起動)について説明し、そしてこれらの効果と現実的な提案をします。最後に、配布における課題についてもいくつか言及します。
2.1. DATASNAPサーバーサンプル
オブジェクトリポジトリには、2つの異なるDataSnapサーバーウィザードがあります。1つはDataSnapサーバープロジェクトをベースにしたウィンドウを作成するもの、もう1つはIIS(Internet Information Services)のようなWebサーバーによってホストされなければならないDataSnapサーバープロジェクトをベースにしたWebBrokerを作成するものです。まず前者からスタートします。
Delphi 2010を起動し、[ファイル|新規|その他]メニューを選択すると、オブジェクトリポジトリに「DataSnapサーバーウィザード」があります。オブジェクトリポジトリのDataSnapサーバーカテゴリーは次の3つのアイコンを表示します。
- DataSnap Server
- DataSnap WebBroker Server
- Server Module
最初のDataSnap Serverアイコンをダブルクリックします(他の2つについてはこのホワイトペーパー内で後ほど説明します)。すると次のようなダイアログが表示されます。
このダイアログの最初のセクションでは、プロジェクトのターゲット設定を行います。デフォルトは、メインフォームと一緒にビジュアルなVCLフォームアプリケーションを作成します。2番目はコンソールアプリケーションで、コンソールウィンドウで動作します。これはリクエストとその応答状況をトレースするには理想的です(サーバーアプリケーションの中で「何が行われているか」を示すには、シンプルなWriteln文を使用することができます)。この両方のアプリケーションタイプは、デモと初期開発には理想的ですが、DataSnapサーバーアプリケーションを最終的に配布したい場合には、それほど理想的ではありません。新しいDataSnapのアーキテクチャーはCOMベースではないため、受信したクライアント接続はDataSnapサーバーアプリケーションを「起動」することができないのです。そのため、受信したクライアントリクエストを処理するためには、DataSnapサーバーは「起動し、稼動している」状態でなければなりません。そして、もし24時間365日、受信リクエストを処理するのであれば、DataSnapサーバーアプリケーションは、その間ずっと稼動し続けていなければなりません。VCL Formsまたはコンソールアプリケーションのために、使用者はWindowsにログオンした状態でサーバーアプリケーションを稼動させていなければならないことを意味しますが、これは決して理想的な状態ではありません。実際に、この場合は3番目の選択の方がより望ましいのです。つまり、Windowsサービスアプリケーションの使用です。これはマシンが起動された時に自動的にインストールと設定がなされ、実行されます(誰かがマシンにログインしている必要はありません)。サービスアプリケーションのマイナス面は、デフォルトではデスクトップ上にアプリケーション自身が表示されず、デバッグが多少難しくなることがあげられます。この3つのアプリケーション形態からベストのものを得るために、VCLフォームDataSnapサーバーアプリケーション、コンソールDataSnapサーバーアプリケーション、そしてWindowsサービスDataSnapサーバーアプリケーションのそれぞれのプロジェクトグループを作成する手順を紹介します。これらの3つはすべて同じカスタムサーバーメソッドを共有しており、その結果DataSnapサーバーアプリケーションを、必要なときに3つの異なるターゲットにコンパイル(そして配布)することが可能になります。
新しいDataSnapサーバーダイアログの2番目のセクションでは、使用可能ないろいろな通信プロトコルを選択できます。DataSnap 2009と比較すると、HTTP通信のほかにHTTP認証も利用できるようになりました。柔軟性を持たせるために、ここではすべてのオプションをチェックしておきます。
これにより、TCP/IPとHTTP、そしてHTTPとHTTP認証の組み合わせについても同様に利用することができます。
新しいDataSnapサーバーダイアログの最後のセクションは、既に設定されています。サーバーメソッドクラスを生成するメソッドがあるとすれば、次のような上位クラスを選択することができます。
- TPersistent
- TDataModule
- TDSServerModule
ベストなのは最後の選択で、起動の直後からメソッドのためのRTTIを可能にします(TDataModuleが標準だと感じることがあるかもしれませんが、何のデータベースも非ビジュアルコントロールも使用していない場合にはおそらくTPersistentの使用で十分です)。
以下のDSServer.pasユニットのコードからの抜粋は、TDSServerModuleとTProviderDataModuleの関連を示しており、TDataModuleから順に派生したものです。
TDSServerModuleBase = class(TProviderDataModule) public procedure BeforeDestruction; override; destructor Destroy; override; end; {$MethodInfo ON} TDSServerModule = class(TDSServerModuleBase) end; {$MethodInfo OFF}
何をすべきかがわからないときには、TDSServerModuleを上位クラスとして選択してください。
2.1.1. マルチターゲットプロジェクトグループ ― VCLフォーム
お約束したとおり、マルチターゲットDataSnapサーバープロジェクトグループを作成しましょう。初めにすべての通信プロトコルを選択したDataSnapサーバーとして、VCL Forms Applicationから始めましょう。
この結果、新しいプロジェクトが作成されます。デフォルトではProject1.dprojという名称で、3つのユニットがあり、これらはデフォルトではServerContainerUnit1.pas、ServerMethodsUnit1.pas、Unit1.pasという名称です。最初に[ファイル|保存]を実行しますが、必要に応じて適当なファイル名を指定して保存します。Unit1.pasファイルは、MainForm.pasという名称で、ServerContainerUnit1.pasはServerContainerUnitDemo.pasという名称、ServerMethodsUnit1.pasはServerMethodsUnitDemo.pas、そしてProject1.dprojは、DataSnapServer.dprojという名称で保存します。
コンソールアプリケーションとサービスアプリケーションをプロジェクトグループに加えます。そして、この時点での状態を確認し、プロジェクトをコンパイルしてみましょう。DataSnapServerプロジェクトをコンパイルすると、エラーメッセージが表示されるはずです(これは私のミスで、生成したServerMethodsUnit1.pasユニットのファイル名を変更したからです)。すなわち、このエラーメッセージは、実行セクションの節を利用したServerMethodsUnitユニットを含むServerContainerUnitDemo.pasユニットによって生じています(Line 30)。同様に、ServerMethodsUnit1.pasをServerMethodsUnitDemoとして保存します。この問題を解決するために、Uses節を変更して、このユニットのファイル名の変更を反映し、再度コンパイルします。今度はServerMethodsUnit1が条件付けとして使われているTServerMethods1クラスのline 37にエラーが発生します。ここでは、ServerMethodsUnit1をServerMethodsUnitDemoへ変更します。これで、その他の問題なくDataSnap Serverプロジェクトをコンパイルすることができます。
ServerContainerUnitDemoの実装部は、次のようになります。
implementation uses Windows, ServerMethodsUnitDemo; {$R *.dfm} procedure TServerContainer1.DSServerClass1GetClass( DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); begin PersistentClass := ServerMethodsUnitDemo.TServerMethods1; end; end.
以下、冒頭の目次紹介にもありましたように、さまざまな用途での具体的な解説記事が約60ページにわたって続きます。このBob Swart氏による『Delphi 2010 DataSnapの活用ガイド』は、Delphiユーザーの必読資料となるでしょう。
資料全体は、エンバカデロ・テクノロジーズ社のWebページよりダウンロードしてください。どなたでも、無償でこの有益なホワイトペーパーをダウンロードすることが可能です。