テスターですが何か?

ホビープログラマ略してHPです

WebロールとWorkerロールの機能を1インスタンスで動かす(3)

leave a comment »

前々回前回とWebロールにWorkerロールの機能を追加して1インスタンスに両方の機能を動かす方法について紹介しました。今回は実際にうごかして両方の機能がちゃんと動いているか確認しようと思います。

まずは、エミュレーター上で動かします。前回作成したMVC4 DPのWebロールをエミュレーター上で実行します。まずはWebロール

image

ちゃんとWebロールとしてWebアプリが動作していますね。(Webロールとして作成したので当たり前ですが)次にCompute Emulator UIからも確認します。Trace.WriteLine("Working", "Information"); の部分がちゃんと動いていることが分かりますね。エミュレーター上では1インスタンスで2つのロールが動いていることが確認できました。

image

次に、Azure上へデプロイして動作を確認したいと思います。その前にWorkerロール機能がちゃんと動いていることがわかりやすくするために、TableStorageへデータを登録する処理を追加します。ソースは適当です。Workerロールが動作していれば、10秒ごとにTableStorageへエンティティが登録されます。

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using System.Diagnostics;
using System.Threading;
using System.Data.Services.Common;
using System.Data.Services.Client;
using Microsoft.WindowsAzure.StorageClient;

namespace MvcWebRole1
{
    public class WebRole : RoleEntryPoint
    {
        public override bool OnStart()
        {
            // For information on handling configuration changes
            // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

            // WindowsAzureストレージアカウントへの接続設定 
            CloudStorageAccount.SetConfigurationSettingPublisher
               ((configName, configSettingPublisher) =>
               {
                   var connectionString = RoleEnvironment.GetConfigurationSettingValue(configName);
                   configSettingPublisher(connectionString);
               });

            return base.OnStart();
        }

        public override void Run()
        {
            // This is a sample worker implementation. Replace with your logic.
            Trace.WriteLine("WorkerRole1 entry point called", "Information");

            // ストレージアカウントへ接続し、クライアントを作成 
            string connectionString = RoleEnvironment.GetConfigurationSettingValue("StorageConnection");
            var account = CloudStorageAccount.Parse(connectionString);
            var client = account.CreateCloudTableClient();

            var context = client.GetDataServiceContext();

            // 初回アクセス時はテーブルの作成を行う 
            if (!client.DoesTableExist("HogeTable"))
            {
                client.CreateTable("HogeTable");
            }

            HogeModels m;

            while (true)
            {
                Thread.Sleep(10000);
                Trace.WriteLine("Working", "Information");

                m = new HogeModels();
                m.PartitionKey = "hoge";
                m.RowKey = Guid.NewGuid().ToString("N");
                m.Value = "hoge";

                context.AddObject("HogeTable", m);
                context.SaveChanges(SaveChangesOptions.Batch);
            }
        }
    }

    [DataServiceKey("PartitionKey", "RowKey")]
    public class HogeModels
    {
        public string PartitionKey { get; set; }

        public string RowKey { get; set; }

        public string Value { get; set; }
    }
}


では、デプロイです。本来なら15分コースなのですがAccelerator for WebRolesを使っているので10秒デプロイが可能です。( ´,_ゝ`)フヒヒサーセン。まずは、Webロール。当たり前のようにちゃんと動いてくれます。そして、Workerロール、あれ?動いてないっぽい。何で…あ~Workerロールの機能だからルートに置かないといけないのかな。Webロール(Webアプリケーションプロジェクト)はIIS上に仮想ディレクトリを作ってたくさん配置できますが、Workerロールは(たぶん)1個しか置けないですからね。エミュレーターで動作させた時もルートに配置されますからね。

仕方なくフルデプロイ

                       ヘ(^o^)ヘ    デ!
                         |∧  
                     /  /
                 (^o^)/       
                /(  )    プ!!
       (^o^) 三  / / >
 \     (\\ 三
 (/o^)  < \ 三    ローーーーーーーーーーー
 ( /
 / く  イ!!!!

そして15分待ちます、Webロール

image

Workerロール(TableStorageへのアクセス)

image

ちゃんと動いたことが確認できました。

まとめ

  • WebロールのWebRole.cs/WebRole.vbにRunメソッドを追加すると、Webロール内にWorkerロールの処理を記述できる(WebロールとWorkerロールを1つのインスタンスで動かすことができる)
  • Workerロールの機能は通常のデプロイで配置する必要がある(Accelerator for WebRoleで配置してはだめ)

Written by david9142

2012年1月14日 @ 4:57 PM

カテゴリー: WindowsAzure

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。