AMY&PINK

日本のITを世界へ!

Windows Azure Servicesを作る

演習4 : ワーカーサービスを使う

この演習では、前の演習で完了したソリューションに対して、新しいワーカーロールプロジェクトを追加します。新しいロールは、前に作成したWCFメッセージロギングサービスを使って、一定間隔毎にメッセージを記録します。
ワーカーロールは、サービスプロセスのようにサービスを提供したり、時間に紐付けられたタスクを実行したりする為にバックグラウンドで実行されます。
ワーカープロジェクトは、WorkerRoleクラスを継承したクラスを持つでしょう(Should)。これは、ロールを開始するためのエントリーポイントになります。

Task 1 - ワーカープロジェクトを追加する

  1. このタスクでは、クラウドサービスプロジェクトの為の新しいロールの追加と、ソリューションへの新しいWorker ロールプロジェクトの追加を実施します。
  2. 演習3で作成したプロジェクトか、”C:\AzureServicesKit\Labs\BuildingWindowsAzureServices\ Ex04-UsingWorkerService \begin\” の begin.slnを開きます。
    ※注意
    もしVisual Studioを終了している場合、スタートメニューからVisual Studioを右クリックして「管理者として実行」から実行してください。
  3. 新しいWorker Role プロジェクトを追加します。ソリューションエクスプローラーのRDComputeプロジェクト内のRolesフォルダを右クリックして、「Add」から、「New Worker Role Project」を選択します。

    .001-addworker.

  4. 「Add new Project」ダイアログで、新しい worker プロジェクトの名前を「RDCompute_WorkerRole」とし、場所を「C:\AzureServicesKit\Labs\BuildingWindowsAzureServices\Ex04-UsingWorkerService\begin\RDCompute」とします。ただし、自分のプロジェクトを使っている場合はデフォルトの値を使います。
    そして、OKをクリックします。

    .002-addwrokerproject.

    .003-newworkerproject.

  5. 全ての変更を保存します。
  6. Ctrl+Shift+B キーを押して、ソリューションをビルドします。

Task 2 - サービス参照の追加

このタスクでは、Exercise 3 で作成した MessageLogger WCFサービスを呼び出すために、サービス参照を追加します。

  1. メッセージロギングサービスの参照を追加します。ソリューションエクスプローラーで、RDDompute_WorkerRoleプロジェクトノードを右クリックして、「サービス参照の追加」を選択します。ソリューション内のMessageLogger サービスのインスタンスを探す為に、「探索」ボタンをクリックします。名前空間を RDService に変更して OK をクリックします。

    .004-addservicereference.

  2. サービス参照の追加ウィザードが追加した App.config ファイルを削除します。以下のタスクでは、サービスにアクセスする為のバインディングとエンドポイントをコードから手動で構成します。

Task 3 - スタートメソッドの実装

このタスクでは、MessageLogger WCFサービスを使ってメッセージを送信する為に、WorkerプロセスのStartメソッドを実装します。

※注意
Startメソッドは、worker role を開始するために呼び出されます。これはコンソールアプリケーションでのMainメソッドと同様なものと考えることができます。ただ、通常、ロールインスタンスが終了するケースで、この関数は値を返しません。

  1. WorkerRole.cs ファイルを開きます。
  2. 名前空間 System.ServiceModel を追加します。
    using System.ServiceModel;
  3. Start メソッドの実装を以下のように変更します。
    (コードスニペット – Building Windows Azure Services Lab - Ex04 Worker Start)

    public override void Start()
    {
        RoleManager.WriteToLog("Information", "Worker role entry point called");
        while (true)
        {
            Thread.Sleep(10000);
    
            string url = "http://localhost/MessageLogger.svc";
            BasicHttpBinding bind = new BasicHttpBinding();
            EndpointAddress endpoint = new EndpointAddress(url);   
    
            RDService.MessageLoggerClient client = new RDService.MessageLoggerClient(bind, endpoint);
            client.LogMessage("Pinging from Worker role");
    
            // ensure channel is closed properly in the event of failure
            if (client.State == CommunicationState.Faulted)
                client.Abort();
            else
                client.Close();
        }
    }
  4. 変数 url  を、サービスのエンドポイントが開発ファブリックでホストされる際に使われるポート番号を含むように変更します。たとえば、以下の様にします。
    string url = "http://localhost:81/MessageLogger.svc";
  5. これまでの変更を保存します。

検証

この演習の全てのステップが正しくできたことを確認するために、以下の処理を実行します。

  1. F5 キーを押してビルドした後、ソリューションを実行します。WebRoleとWorkerRoleの両方のインスタンスが動く開発ファブリックが確認できるでしょう。

    .005-devfablic.

  2. メッセージが生成されていることを確認するために、以下のURLを確認します。
    http://127.0.0.1:81/Shoutbox.aspx
  3. 10秒毎に、ワーカーロールによってメッセージが生成されていることが確認できます。

    .006-ie.

  4. Visual Studio に戻って、SHIFT+F5 キーを押してデバッグを終了します。