Workflow Service の Azure SQL Database への永続化 (Persistence)


環境 : Visual Studio 2010 Service Pack 1 (SP1), .NET Framework 4 Platform Update 1 - Design-time Update for Visual Studio 2010 SP1 (日本語), Windows Azure Tools for Visual Studio 2010 v1.5 (September 2011), Windows Azure SDK 1.5 (September 2011)

.NET 4 Platform Update 1 の WF 新機能

こんにちは。

上記 3 回連載の最終回ですが、お待たせして すみません。

実は、.NET Framework 4 Platform Update 1 (.NET 4 PU1) が Windows Azure のプロジェクトに対応するのを待っていたのですが、ようやくご紹介できるようになりましたので、最終回を記載したいと思います。

もう、何の話をしていたか忘れてしまったかもしれませんが、.NET Framework 4 PU 1 では、Windows Azure SQL Database (旧 SQL Azure) を使って WF のワークフローの永続化が可能になっています。

MSDN : What's New in Windows Azure」に記載されているように、既に、2011 年 7 月 15 日 (July 15, 2011) のアップデートで、Windows Azure の Guest OS で .NET Framework 4 Platform Update 1 (.NET 4.0.1) が対応されています。そして、更新情報には載っていないですが、現在は、SDK や CSUpload などでも配置可能になっているようです。

つまり、この .NET Framework 4 PU 1 によって、以下が可能になっています。

  • Windows Azure SQL Database 上にワークフロー (WF) の永続化データベースを作成して利用できるようになりました。
  • Windows Azure 上にホストされるワークフロー サービスで、ステートマシン ワークフロー (第 1 回 を参照) など、Platform Update 1 の機能が使用できるようになりました。

さっそく、サンプル コードを使って見ていきましょう。

 

Windows Azure SQL Database へのデータベースの作成

では、まず、WF の永続化をおこなうためのデータベースを Windows Azure SQL Database に構築してみましょう。

Windows Azure SQL Database (SQL Azure) の管理画面を開き、データベースを新規作成します。(今回は、「WFPersistDB」という名前のデータベースを作成します。)

ご存じの方も多いかと思いますが、Windows Azure SQL Database は、SQL Server と同一ではなく、いくつかの機能が制限されています。その中の 1 つに、allow_page_locks があり、.NET 4 の永続化データベースでは、この allow_page_locks を使用していましたが、新しい .NET 4 PU1 のスクリプトでは、この allow_page_locks を使用しないようになっています。(.NET 4 PU1 がインストールされた環境の SqlWorkflowInstanceStoreSchema.sql には、こうしたコメントが記載されていますので確認してみてください。)
このため、この新しいスクリプト (.sql) を使って、Windows Azure SQL Database に永続化データベースを作成することが可能です。

コマンド プロンプトを管理者権限で開き、%windir%\Microsoft.NET\Framework\v4.0.30319\SQL\<言語> のディレクトリーに移動して、以下のコマンドを実行します。
(お使いの環境にあわせ、AAAAAAAAAA には Windows Azure SQL Database の DNS 名、testuser / XXXXXXX には Windows Azure SQL Database の ログイン ユーザー ID / パスワード を設定してください。)

sqlcmd -S AAAAAAAAAA.database.windows.net -d WFPersistDB -U testuser@AAAAAAAAAA -P XXXXXXX -i SqlWorkflowInstanceStoreSchema.sql
sqlcmd -S AAAAAAAAAA.database.windows.net -d WFPersistDB -U testuser@AAAAAAAAAA -P XXXXXXX -i SqlWorkflowInstanceStoreLogic.sql

補足 : Windows Azure SQL Database への接続では、TCP が使用されます。企業のプロキシー設定などで、TCP をブロックしている場合は、上記の方法では接続できないので注意してください。(この場合、Windows Azure SQL Database の管理ポータルを使用して、スクリプトを実行してください。)

 

アプリケーションの構築

SP1 と .NET 4 PU1 のインストールされた Visual Studio 2010 を、管理者権限で実行します。

ターゲットフレームワークとして [.NET Framework 4 Platform Update 1] を選択して、[Windows Azure Project] を新規作成し、ウィザードで [WCF Service Web Role] を追加します。

今回は、ワークフロー サービス (.xamlx) を構築するので、既存で作成された以下のコード ファイルを削除します。

IService1.cs

Service1.svc (及び、Service1.svc.cs)

WCF Service Web Role のプロジェクトを右クリックして、[追加] - [新しい項目] で、([Workflow] グループの) [WCF ワークフロー サービス] を追加します。(Service1.xamlx が追加されます。)

今回は、永続化の確認をするだけなので、下図のように、GetData1、GetData2 の 2 回の要求 (Request) を処理して答え (Response) を返す単純なワークフローを構築しましょう。(今回は、普通に、シーケンシャル ワークフローを作成します。もちろん、ステートマシン ワークフローを構築していただいても構いません。)

なお、上図のように、2 つのメッセージを処理する場合には、必ず、Correlation の設定を忘れずに実施してください。(Correlation を設定しないと、1 番目のメッセージと 2 番目のメッセージの間で、ワークフロー インスタンスのマッピングができません。)
ここでは、この概念や設定方法は説明しませんが、以前 投稿した「.NET 4 の WCF / WF 入門」で説明していますので、是非 参照してください。(最初の Receive Request アクティビティの [CanCreateInstance] プロパティも、忘れずに、true に設定してください。)

このワークフローを、上記で作成した Windows Azure SQL Database のデータベースに永続化可能にするため、WCF Service Web Role のプロジェクトの Web.config を開き、下記の太字の通り追記します。

. . .

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        . . .

        <workflowIdle timeToUnload="0"/>
        <sqlWorkflowInstanceStore
          connectionString="Data Source=AAAAAAAAAA.database.windows.net;Initial Catalog=WFPersistDB;User Id=testuser@AAAAAAAAAA;Password=XXXXXXX"
          instanceEncodingOption="None"
          instanceCompletionAction="DeleteAll"
          instanceLockedExceptionAction="BasicRetry"
          hostLockRenewalPeriod="00:00:30"
          runnableInstancesDetectionPeriod="00:00:05"/>
        </behavior>
    </serviceBehaviors>
  </behaviors>
  . . .

</system.serviceModel>
. . .

上記では、ワークフローがアイドル状態になった際に、ワークフローをアンロード (Unload) して、データベースに永続化するように指定しています。このため、上図のワークフローで、最初の Receive アクティビティ (GetData1) が呼ばれると、次の Receive アクティビティ (GetData2) が呼ばれるまで、ワークフローは Windows Azure SQL Database に永続化されます。
また、上記の instanceCompletionAction 属性により、GetData2 の呼び出しが成功してワークフローが完了すると、データベースに永続化されていたインスタンス情報は削除されます。

 

Windows Azure への配置と動作確認

では、実際に配置して動作を確認してみましょう。

ソリューション エクスプローラーで、クラウドのプロジェクトをマウスで右クリックして、[Package] を選択すると、パッケージが作成されます。そして、Windows Azure ポータル画面 を使用して、このパッケージを、あらかじめ作成しておいた Hosted Service にアップロードします。

クライアントを作成して、動作を確認してみましょう。

補足 : 今回、クライアントの作成手順の説明は省略します。構築手順については、上記で記載した「.NET 4 の WCF / WF 入門」の「ワークフローを使用したサービスの作成 (ワークフロー サービス)」を参照してください。

まず、Windows Azure SQL Database (SQL Azure) のポータル画面で、上記のデータベース (WFPersistDB) にログインして InstancesTable テーブルを確認すると、下図の通り、データは入っていない (0 件) ことがわかります。

作成したクライアントから、このワークフロー サービスに接続し、上図 (ワークフロー) の GetData1 メソッドを呼び出します。
この段階で、Windows Azure SQL Database (SQL Azure) のポータル画面で、InstancesTable テーブルを確認すると、下図の通り、データが 1 件追加されているのが確認できます。

ワークフローはメモリ上から退避されて、データベースに永続化されているため、このサービスをいったん停止 (Windows Azure ポータル画面で、Hosted Service の Deployment を停止) して、再度、開始をおこなっても、このワークフロー インスタンスでは、引き続き、GetData2 を呼び出すことが可能です。

また上述の通り、GetData2 を呼び出してこのワークフロー インスタンスを完了すると、InstancesTable テーブルからデータが削除されます。

 

その他の留意点

Microsoft Suppport : Microsoft .NET Framework 4 Platform Update 1 - Runtime Update」に依ると、.NET Framework 4 Platform Update 1 (.NET 4.0.1) では、下図の通り、MaxConnectionRetries 属性も使用可能になっています。この属性を設定することで、Windows Azure SQL Database への接続に失敗した場合にリトライする回数を指定できます。 (既定値は、3 になっています。)

. . .

  <sqlWorkflowInstanceStore maxConnectionRetries="15" . . ./>
. . .

これで、いよいよ本格的に Windows Azure 上で動くカスタムのワークロー サービスを構築できますが、まだ、単なる永続化のため、Windows Server AppFabric Host Services (Dublin) のような リカバリー機能、高度な管理機能などの機能はありませんので注意してください。(例えば、Windows Server AppFabric のように、バックグラウンドで実行中のワークフロー インスタンスが実行途中で停止した場合に、Windows サービスにより自動リカバリーする機能は持っていません。)

なお、Windows Azure 上のさまざまな機能 (Azure Blob Storage、Azure Table Storage、Azure AppFabric Cache など) と連携したワークフローを構築する場合、まだ CTP 版ですが、「Workflow Foundation Activity Pack for Windows Azure」なども使用可能です。(この Workflow Foundation Activity Pack for Windows Azure については、Windows Azure チームのブログ を参考にしてください。)

 

Comments (0)

Skip to main content