Delphi Labs: DataSnap XE - Windows サービスとしての DataSnap サーバー

By: Chikako Yonezawa

Abstract: この Delphi Labs のエピソードの中で、さまざまな DataSnap アプリケーションの種類を確認し、デモプロジェクトとして Delphi DataSnap サーバーアプリケーションを Windows サービスとして実装します。

    はじめに

DataSnap アーキテクチャはとても柔軟でオープンです。現在、Delphi および C++Builder を使用して DataSnap サーバーを実装することができ、そして、Delphi、C++、Delphi Prism、PHP および JavaScript を使用してクライアントを実装することが可能です。

DataSnap サーバーは、スタンドアロン、または Web アプリケーションとして実装することが可能です。クライアントとサーバー間の通信に TCP/IP または HTTP のような異なるプロトコルを使用することができます。

Jim Tierney の CodeRage カンファレンスプレゼンテーション “DataSnap Application Types” の中で、さまざまな DataSnap アプリケーションの種類、接続のプロトコル、およびオプションの議論の詳細を見つけることができます。レコーディングしたものが、 http://channel-e.embarcadero.com/index.php?option=com_jvideodirect&x=1&v=Qxne3uhuP1k1T で公開されています。

サーバーとクライアントを、すべての可能な種類で構築することを試みることはとても興味深いことですが、時間のかかる作業です。

このチュートリアルの中で、Delphi を使用して “Windows サービス” としてDataSnap サーバーを実装するための必要な手順を説明します。これは、DataSnap デモの中で、あまり頻繁に使用される機能ではありませんが、オペレーティングシステムのサービスとして DataSnap サーバーを実装することは大きな意味を持ちます。基本的に、サーバーが、マシンの中で OS のサービスとしてデプロイされるときに、スタートアップ時に自動的に開始しますし、クラウド(例: Amazon EC2)上で新しく作成されたマシンのインスタンスと対話する必要はありません。マシンを起動するだけで良いですし、さらに良いことにロードバランサを自動的に開始させることも可能です。

それを試してみましょう。

    Windows のサービスとしてサーバーを構築する

IDE メニューの [ファイル|新規作成|その他] をクリックし、Delphi DataSnap サーバーアプリケーションを作成するため、表示された「新規作成」ダイアログ内の “Delphi プロジェクト- DataSnap Server” カテゴリの “DataSnap Server” をダブルクリックしてウィザードを起動します。

Hide image
Click to see full-sized image

expand view>>

ウィザードの最初のタブでは、アプリケーションの種類として “サービスアプリケーション” を選択します。

Hide image
Click to see full-sized image

expand view>>

サーバーの機能はデフォルト値のままにし、接続のためのプロトコルとして TCP/IP を使用し、認証/権限付与は行わず、サンプルのサーバーメソッドを生成します。

Hide image
Click to see full-sized image

expand view>>

3番目の画面では、デフォルトの TCP/IP 211 ポートのままとし、それが使用できるかを確認します。

Hide image
Click to see full-sized image

expand view>>

ウィザードの最後のページでは、サーバーメソッドの実装をデフォルトの基底クラスのままとして、[完了] ボタンをクリックします。

[ファイル|すべて保存] を選択し、ウィザードで生成された新しいプロジェクトのすべてのファイルを保存します。私の場合、ファイルを保存するために、新しく“C:\DataSnapLabs\WinServiceApp\” フォルダを作成しました。サーバーメソッドとサーバーコンテナユニット (たとえば “ServerMethodsUnit2” と “ServerContainerUnit2” のような) はデフォルトの名前のままにし、全体のプロジェクトの名前として “DataSnapWinServiceApp” と命名しました。

サーバーメソッドユニットは、他の Delphi DataSnap サーバーアプリケーションの種類と全く同じです。サーバーコンテナユニット、およびメインのプロジェクトのユニットは、“Windows Service” のアプリケーション形式特有のいくつかの Delphi コードを含んでいます。

DataSnap サーバーサービスアプリケーションは、プロジェクトマネージャ内でこのように表示されます。

Hide image
DataSnap114

サーバーコンテナユニット(ServerContainerUnit) を開き、ウィザードによって生成されたコードを確認します。

unit ServerContainerUnit2;

interface

uses
  SysUtils, Classes, 
  SvcMgr, 
  DSTCPServerTransport,
  DSServer, DSCommonServer, DSAuth; 

type
  TServerContainer2 = class(TService)
    DSServer1: TDSServer;
    DSTCPServerTransport1: TDSTCPServerTransport;
    DSServerClass1: TDSServerClass;
    procedure DSServerClass1GetClass(DSServerClass: TDSServerClass;
      var PersistentClass: TPersistentClass);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
  private
    { Private declarations }
  protected
    function DoStop: Boolean; override;
    function DoPause: Boolean; override;
    function DoContinue: Boolean; override;
    procedure DoInterrogate; override;
  public
    function GetServiceController: TServiceController; override;
  end;

var
  ServerContainer2: TServerContainer2;

implementation

uses Windows, ServerMethodsUnit2;

{$R *.dfm}

procedure TServerContainer2.DSServerClass1GetClass(
  DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass);
begin
  PersistentClass := ServerMethodsUnit2.TServerMethods2;
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  ServerContainer2.Controller(CtrlCode);
end;

function TServerContainer2.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

function TServerContainer2.DoContinue: Boolean;
begin
  Result := inherited;
  DSServer1.Start;
end;

procedure TServerContainer2.DoInterrogate;
begin
  inherited;
end;

function TServerContainer2.DoPause: Boolean;
begin
  DSServer1.Stop;
  Result := inherited;
end;

function TServerContainer2.DoStop: Boolean;
begin
  DSServer1.Stop;
  Result := inherited;
end;

procedure TServerContainer2.ServiceStart(Sender: TService; var Started: Boolean);
begin
  DSServer1.Start;
end;

end.

最初に注意することは、サーバーコンテナクラスが、“SvcMgr” ユニットで定義されている “TService” クラスから派生しているという点です。そしてそれは、このクラスから仮想メソッドのいくつかをオーバーライドします。すなわち、“DoStop”, “DoPause”, “DoContinue” および “DoInterrogate” です。それらは、Windows の一部である “サービス” アプレット内の操作に応答して呼び出されるメソッドです。

さて、プロジェクトをビルドする必要があります。それを行う方法はいろいろあります。たとえば、プロジェクトマネージャ内で、マウスの右ボタンをクリックし、“ビルド” を選択します。

Hide image
DataSnap115

今、Windows へ我々のサービスをインストールする時です。それは、“サービス” アプレットで表示されます。

デフォルトのビルド設定の場合、プロジェクトがあるディレクトリの “Debug\Win32” サブフォルダ内に実行ファイルを見つけることができます。私の場合、“C:\DataSnapLabs\WinServiceApp\Debug\Win32\DataSnapWinServiceApp.exe” となります。

管理者権限で Windows のコマンドプロンプトを開き、このディレクトリへ移動します。

Hide image
Click to see full-sized image

expand view>>

サービスをインストールするには、コマンドラインから“/INSTALL” パラメータを渡して実行する必要があります。 サービスをアンインストールするには、 “/UNINSTALL” を渡します。

管理者によってコンソールが開始されているかを確かめてください。そうでなければ、サービスをインストールすることはできません。

Windows サービスアプリケーションはユーザーインターフェースを何ももっていません。それと対話する唯一の方法は、オペレーティングシステムの “サービス” アプレットを使用することです。

サービスアプリケーションが実行中であるかを確認するために、サービスの中でそれを確認するか、またはクライアントから機能を呼びだすことを試みる必要があります。

“タスクマネージャー” を開くと、サービスとして “ServerContiner2” が起動されていることが確認できます。ユーザーからサービスを表示できるオプションがチェックされていることを確かめてください。

Hide image
Click to see full-sized image

expand view>>

Windows のユーティリティである “リソースマネージャ” を使用した場合、以下のように表示されます。

Hide image
Click to see full-sized image

expand view>>

基本的なクライアントアプリケーションもありますが、サーバーへの接続をテストし、サーバーメソッドを表示するのであれば、 “データエクスプローラ” を使用することが、おそらく、より早い方法でしょう。

DataSnap サーバーへの新しい接続を作成します。 “データエクスプローラ” 内の “DATASNAP” ノード上で、マウスの右ボタンをクリックし、 “新規接続を追加” を選択します。

必要に応じて、たとえば “TCP_211_LOCAL” のように、接続の名前を変更することができます。

“接続の変更” を選択し、サーバーが起動しているのであれば、確かめるために [テスト接続] のボタンをクリックしてください。

Hide image
Click to see full-sized image

expand view>>

Windows サービスとして実装された Delphi DataSnap Server が正常にデプロイされました!

OS のサービスとして DataSnap サーバーを実装する主な利点は、デフォルトで自動的に開始されるので、サービスの開始に関する心配がないということです。

    まとめ

DataSnap アーキテクチャは、RAD Studio で利用できるさまざまなプログラミング言語で、異なる種類のアプリケーションを接続する接着剤のようなものです。Delphi および C++Builder でサーバーを、Delphi、C++Builder、RadPHP、Delphi Prism および JavaScript でクライアントを実装することができます。

この “Delphi Labs” の記事の中で、“Windows サービス” として Delphi DataSnap サーバーアプリケーションを構築する手順を紹介しました。OS のサービスは、ユーザーインターフェースは何も持っていないので、それらと対話する唯一の方法は、サービスコントロールマネージャを介することです。アプリケーションは、OS のスタートアップにてデフォルトで自動的に開始するサービスとして実装されています。そのためロードバランサが、管理者に代わって自動的にインスタンスを開始および停止する EC2 クラウドへデプロイしたサーバーインスタンスを管理するのにとても使いやすいものです。

さまざまな DataSnap アプリケーションの種類の議論の詳細は、Channel-E の “DataSnap Application Types” CodeRage5 カンファレンスプレゼンテーション http://channel-e.embarcadero.com/index.php?option=com_jvideodirect&x=1&v=Qxne3uhuP1k1T として公開されています。

この記事のソースコードは、Code Central (http://cc.embarcadero.com/item/28270) で公開しています、またデモのビデオは、YouTube (http://www.youtube.com/watch?v=ovZ-W4qVWgQ) で公開しています。

"Delphi Labs" についての詳細は、以下で公開しています。

Server Response from: ETNASC04